<深入浅出MySQL>读书笔记之SQL模式
Contents
查看默认的SQL Mode
mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-------------------------------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
设置模式
SET [SESSION|GLOBAL] sql_mode=‘modes’,其中SESSION选项表示只在本次连接中生效;而GLOBAL选项表示在本次连接中并不生效,而对于新的连接则生效,这种方法在MySQL 4.1开始有效。另外,也可以通过使用“–sql-mode=“modes””选项,在MySQL启动时设置sql_mode
SQL 模式功能
验证日期的合法性.例如:
mysql> create table t_mode(t datetime); Query OK, 0 rows affected (0.02 sec) mysql> set session sql_mode='ansi' -> ; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> insert into t_mode values('2007-04-32'); Query OK, 1 row affected, 1 warning (0.01 sec) mysql> select * from t_mode; +---------------------+ | t | +---------------------+ | 0000-00-00 00:00:00 | +---------------------+ 1 row in set (0.00 sec) mysql> set session sql_mode='traditional'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> insert into t_mode values('2007-04-32'); ERROR 1292 (22007): Incorrect datetime value: '2007-04-32' for column 't' at row 1 mysql>
在insert或update过程中, 如果sql mode处于
traditional
模式,mod(x,0)
就会产生错误. 这是因为traditional
也属于严格模式.在非严格模式下mod(x,0)
返回的结果是NULL
.启用
NO_BACKSLASH_ESCAPES
: 使反斜线成为普通字符. 在导入数据时, 如果数据中含有反斜线, 那么启用NO_BACKSLASH_ESCAPES
模式可以保证数据的正确性.启用
PIPES_AS_CONCAT
: 将|
视为字符串连接操作符.在Oracle中,|
是字符串连接操作符, 所以在其他数据库中含有|
操作符的SQL在MySQL中将无法执行, 为了解决这个问题, MySQL提供了PIPES_AS_CONCAT
模式.在MySQL与其他异构数据库之间有数据迁移的需求, 就可以利用sql mode来帮助迁移.