本文地址:https://www.askmac.cn/archives/mysql-sql-mode.html
3.6.1 设置SQL模式
MySQL Server中的许多操作特性可以通过设置SQL模式(SQL mode)来进行配置。模式包含了可选值,其每个值控制了查询处理的某个方面。经过恰当的设置,服务就能按指导对输入数据采取严格或宽容的处理,启用或禁用对SQL一致性有关的操作,或者提供对其它数据库更好的兼容性。这一节将讨论如何设置SQL模式。
默认情况下,SQL模式值为空值,因此没有特定的限制或一致性行为要求被启用。独立的客户端按他们自己的需要来配置SQL模式,不过也可以通过在服务启动时使用 --sql-mode
项来设置默认的SQL模式。你可能在运行数据库时需要某个模式来更小心地处理无效数据或建立MySQL用户账号。例如,如果你启用TRADITIONAL模式,MySQL Server会如其它数据库一样对输入的数据进行强制约束,而不会采取宽容态度。它这种模式不会允许未设置密码的新账号被建立。你可以通过配置文件来启用TRADITIONAL SQL模式:
1
2
|
[mysqld]
sql–mode=TRADITIONAL
|
你可以在启动mysqld时使用 --sql-mode=”mode_value”
来设置SQL模式,或者可以通过使用SET命令来设置sql_mode变量来实现:
1
|
SET [SESSION|GLOBAL] sql_mode=’mode_value’
|
设置的值可以是空值,或是由一个或多个模式使用逗号组成的混合模式。如果是空值或两个以上模式值,你需要用单引号括起来。尽管SQL模式值在设置时总是使用大写,但是实际上其对大小写不敏感,以下是一些例子:
- 清空SQL模式值:
SET sql_mode=’’; |
- 使用单个模式值对SQL模式进行设置:
SET sql_mode=ANSI_QUOTES;SET sql_mode=’TRADITIONAL’; |
- 使用多个模式值对SQL模式进行设置:
SET sql_mode=’IGNORE_SPACE,ANSI_QUOTES’; |
如果需要检查当前sql_mode设置,可以使用以下命令:
1
|
mysql> SELECT @@sql_mode;
|
1
2
|
mysql> set sql_mode=’traditional’;
mysql> select @@sql_mode\G
|
3.6.2 SQL模式值
以下列出了对一些通用模式值的简单描述:
- ANSI_QUOTES
此模式将导致双引号【”】被用于作为标识符引用字符,而不能用于作为字符串引用字符。
- IGNORE_SPACE
默认情况下,功能函数和括号之间不能有空格。启用此模式后,服务会无视功能后的空格。这将允许功能函数和括号间有空格,但这有可能导致有些功能被认作为保留字。
- ERROR_FOR_DIVISION_BY_ZERO
默认,被0除后所得返回结果为NULL。启用此模式后,在插入表数据的内容中,如果存在除以0,将会生成警告,如果同时也启用了严格模式,则会返回错误。(在MySQL 5.7.4以后,此模式被合并入STRICT_ALL_TABLES,STRICT_TRANS_TABLES模式中)
- STRICT_TRANS_TABLES, STRICT_ALL_TABLES
这些模式值启用了【严格模式(strict mode)】,它对数据库输入可接受的值进行了某些严格限定。默认,MySQL会对于某些遗漏的值,超出范围,或奇怪的值采取宽容处理。启用严格模式将造成这些值在录入时被报错处理。
STRICT_TRANS_TABLES 启用了对所有事务表的严格模式,而STRICT_ALL_TABLES启用了对所有表的严格模式。
- TRADITIONAL
这是一个复合模式,它在启用严格模式的同时还加入了其它一些输入数据的采纳限制。
- ANSI
这也是一个复合模式,启用它会导致MySQL Server更符合ANSI标准。也就是说,其表现行为更像标准SQL,如其模式中含有ANSI_QUOTES(之前提到的)和PIPES_AS_CONCAT,使用【||】来作为字符串连接符,而不是作为逻辑或操作。
注意: 官方文档手册中列出所有可用的SQL模式值,如需查看MySQL5.7相关模式值,可访问:
http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
Comment