转自:http://hi.baidu.com/houqiang_hq/item/125b8b0aa0b05e096c9048d5
1.sql mode简介
在Mysql中,sql
mode可以用来解决以下问题
(1).通过设置不同的sql
mode,可以在不同严格程序进行数据校验.有效地保证了数据准确性.
(2).通过设置sql
mode为ANSI模式,来保证大多数SQL符合标准SQL的语法,这样在不同数据库之间迁移时,不需要对业务
修改太多.
在Mysql 5.0以下,查询默认的sql mode(sql
mode参数)有:real_as_float,pipes_as_concat,ansi_quotes,gnore_space和ANSI。在这些模式下可以插入超过字段定义长度的数据,或是在字段中没有定义的元素数据(如,enum)。不过在插入后会有一个warning(可以用
show warnings来查看)。
可以通过设置sql
mode为STRICT_TRANS_TABLES(严格模式)来实现数据的严格校检,使错误数据不能插入,从而保证数据准确性。
TRADITIONAL模式也属于严格模式,同样可以实现严格校检,使错误数据不能插入,从而保证数据准确性。不过在这种模式MAX(X,0)返回的结果是NULL,所以在包含有MAX的运算中根据实际情况设定好sql
mode.
2.ENUM简介
ENUM是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。
在某些情况下,ENUM值也可以为空字符串(‘‘)或NULL:
如果你将一个非法值插入ENUM(也就是说,允许的值列之外的字符串),将插入空字符串以作为特殊错误值。该字符串与“普通”空字符串不同,该字符串有数值值0。
如果将ENUM列声明为允许NULL,NULL值则为该列的一个有效值,并且
默认值为NULL。如果ENUM列被声明为NOT
NULL,其默认值为允许的值列的第1个元素。
每个枚举值有一个索引:
来自列规定的允许的值列中的值从1开始编号。
空字符串错误值的索引值是0。这说明你可以使用下面的SELECT语句来找出分配了非法ENUM值的行:
select
* from test where
browsertype=0;
NULL值的索引是NULL。
例如,定义为ENUM的列(‘one‘,‘two‘,‘three‘)可以有下面所示任何值。还显示了每个值的索引:
值
索引
NULL NULL
1 ‘one‘
2
‘two‘
3
‘three‘
枚举最多可以有65,535个元素。
当创建表时,ENUM成员值的尾部空格将自动被删除。
当检索时,保存在ENUM列的值使用列定义中所使用的大小写来显示。请注意可以为ENUM列分配字符集和
校对规则。对于二进制或大小写敏感的校对规则,当为列分配值时应考虑大小写。
3.举列测试
(1)sql
mode为ANSI
mysql> create table test(id bigint(20)
auto_increment primary key,
-> browsertype
enum(‘ie‘,‘firefox‘,‘other‘)
-> );
Query OK,
0 rows affected (0.10 sec)
mysql> desc
test;
+-------------+------------------------------+------+-----+---------+----------------+
|
Field | Type | Null | Key | Default | Extra
|
+-------------+------------------------------+------+-----+---------+----------------+
|
id | bigint(20) | NO | PRI | NULL | auto_increment |
|
browsertype | enum(‘ie‘,‘firefox‘,‘other‘) | YES | | NULL |
|
+-------------+------------------------------+------+-----+---------+----------------+
2
rows in set (0.05 sec)
mysql> set session
sql_mode=‘ANSI‘;
Query OK, 0 rows affected (0.14
sec)
mysql> insert into test(browsertype) values(‘ie‘)
;
Query OK, 1 row affected (0.07
sec)
mysql> insert into test(browsertype)
values(‘maxthon‘) ;
Query OK, 1 row affected (0.03
sec)
mysql> show
warnings;(数据虽然成功insert,但有warning)
+---------+------+--------------------------------------------------+
|
Level | Code | Message
|
+---------+------+--------------------------------------------------+
|
Warning | 1265 | Data truncated for column ‘browsertype‘ at row 1
|
+---------+------+--------------------------------------------------+
1
row in set (0.01 sec)
mysql> select * from
test;
+----+-------------+
| id | browsertype
|
+----+-------------+
| 1 | ie
|
| 2 | |
+----+-------------+
2
rows in set (0.01 sec)
mysql> select * from test where
browsertype=0;(空字符串错误值的索引值是0。SELECT可找出分配了非法ENUM值的行)
+----+-------------+
|
id | browsertype |
+----+-------------+
| 2 |
|
+----+-------------+
1 row in set (0.04
sec)
(2)使用严格模式(STRICT_TRANS_TABLES)
mysql>
set session sql_mode=‘STRICT_TRANS_TABLES‘;
Query OK, 0 rows
affected (0.00 sec)
mysql> select
@@sql_mode;
+---------------------+
| @@sql_mode
|
+---------------------+
| STRICT_TRANS_TABLES
|
+---------------------+
1 row in set (0.00
sec)
mysql> select * from
test;
+----+-------------+
| id | browsertype
|
+----+-------------+
| 1 | ie
|
| 2 | |
+----+-------------+
2
rows in set (0.00 sec)
mysql> insert into
test(browsertype) values(‘maxthon‘) ;
ERROR 1265: Data truncated
for column ‘browsertype‘ at row 1
mysql> insert into
test(browsertype) values(‘firefox‘) ;
Query OK, 1 row affected
(0.00 sec)
mysql> select * from
test;
+----+-------------+
| id | browsertype
|
+----+-------------+
| 1 | ie
|
| 2 | |
| 3 | firefox
|
+----+-------------+
3 rows in set (0.00
sec)
(3) TRADITIONAL模式
mysql> create
table t11 (i int);
Query OK, 0 rows affected (0.02
sec)
mysql> set sql_mode=‘ANSI‘;
Query
OK, 0 rows affected (0.00 sec)
mysql> insert into t11
values(9%4);
Query OK, 1 row affected (0.00
sec)
mysql> select * from
t11;
+------+
| i
|
+------+
| NULL
|
+------+
1 row in set (0.00
sec)
mysql> set
sql_mode=‘TRADITIONAL‘;
Query OK, 0 rows affected (0.00
sec)
mysql> insert into t11
values(9%0);
ERROR 1365: Division by
0
mysql> show
warnings;
+-------+------+---------------+
|
Level | Code | Message
|
+-------+------+---------------+
| Error |
1365 | Division by 0
|
+-------+------+---------------+
1 row in set
(0.02 sec)
归根到低要把 mysql 从严格模式下 改为宽松模式 只要找到my.ini文件
搜索查到
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
把sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
改为sql-mode="ANSI"
重启Mysq服务即可