SQL大小写规则
一、Linux下数据库名、表名、列名、别名大小写规则
- 数据库名、表名、表的别名、变量名是严格区分大小写的;
- 关键字、函数名称在 SQL 中不区分大小写;
- 列名(或字段名)与列的别名(或字段别名)在所有的情况下均是忽略大小写的; MySQL在Windows的环境下全部不区分大小写
二、编写建议
- 关键字和函数名称全部大写;
- 数据库名、表名、表别名、字段名、字段别名等全部小写;
sql_mode
一、宽松模式和严格模式
宽松模式
作用
如果设置的是宽松模式,那么我们在插入数据的时候,即便是给了一个错误的数据,也可能会被接受, 并且不报错。
应用场景
通过设置sql mode为宽松模式,来保证大多数sql符合标准的sql语法,这样应用在不同数据 库之间进行 迁移 时,则不需要对业务sql 进行较大的修改。
严格模式
作用
MySQL5.7版本就将sql_mode默认值改为了严格模式。所 以在 生产等环境 中,我们必须采用的是严格模式,进而 开发、测试环境 的数据库也必须要设置,这样在 开发测试阶段就可以发现问题。并且我们即便是用的MySQL5.6,也应该自行将其改为严格模式。
应用场景
MySQL等数据库总想把关于数据的所有操作都自己包揽下来,包括数据的校验,其实开发 中,我们应该在自己 开发的项目程序级别将这些校验给做了 ,虽然写项目的时候麻烦了一些步骤,但是这 样做之后,我们在进行数据库迁移或者在项目的迁移时,就会方便很多。
二、查看当前的sql_mode
session中的sql_mode
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gkDkeLa8-1655198002167)(F:\MarkDown学习\图片素材-1\MySQL高级篇\字符集问题\7.查看session中的sql_mode.jpg)]
global中的sql_mode
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sMGRabUD-1655198002168)(F:\MarkDown学习\图片素材-1\MySQL高级篇\字符集问题\8.查看global中的sql_mode.jpg)]
三、修改sql_mode
临时设置方式:
# 全局
SET GLOBAL sql_mode = 'modes...';
# 当前会话
SET SESSION sql_mode = 'modes...';
永久设置方式:
在/etc/my.cnf中配置sql_mode,新增:
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR
_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
然后 重启MySQL
实际生成中
当然生产环境上是禁止重启MySQL服务的,所以采用 临时设置方式 + 永久设置方式 来解决线上的问题, 那么即便是有一天真的重启了MySQL服务,也会永久生效了。
四、各sel_mode的意义
模式 | 作用 | |
1 | ONLY_FULL_GROUP_BY | 对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY中出现,那么这个SQL是不合法的 |
2 | STRICT_TRANS_TABLES | 在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做限制 |
3 | NO_ZERO_IN_DATE | 在严格模式下,不允许日期和月份为零 |
4 | NO_ZERO_DATE | 设置该值,mysql数据库不允许插入零日期,会报错 |
5 | ERROR_FOR_DIVISION_BY_ZERO | 在INSERT或UPDATE过程中,如果数据被零除,会报错 |
6 | NO_AUTO_CREATE_USER | 禁止授权创建密码为空的用户 |
7 | NO_ENGINE_SUBSTITUTION | 如果需要的存储引擎被禁用或未编译,则抛出错误 |
8 | NO_AUTO_VALUE_ON_ZONE | 该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下一个自增长值。如果用户希望插入的值为0,而该列又是自增长,那么这个选项就起作用了 |
9 | PIPES_AS_CONCAT | 将“||”视为字符串的连接操作符而不是或运算符 |
10 | ANSI_QUOTES | 不能用双引号来引用字符串,以你为它被解释为识别符 |
前七种是常用的