2010年9月15日星期三

MySQL varchar自动截取处理

在调试中发现有乱码,导致程序异常,到数据库中看时,的确后面有一个乱码。
查明是最后一个字符被截取了,但应用程序没有作任何截取的操作,尝试后发现是Mysql干的。

Mysql有一个SQL_MODE模式,一般情况下是空,你可以查询你的Mysql库是什么模式:
select @@sql_mode; ##我的是空
在这个情况下,当你插入一条记录时,当有字段超出长度,mysql自动作了截取后存入数据库(会给条警告的信息)。

一般情况下我们不允许这样(为什么有这种处理,很奇怪),设置sql_mode为严格模式:
mysql> set SQL_MODE='TRADITIONAL';
Query OK, 0 rows affected (0.00 sec)

mysql> select @@sql_mode;
+-------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode                                                                                                                    |
+-------------------------------------------------------------------------------------------------------------------------------+
| STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,TRADITIONAL,NO_AUTO_CREATE_USER |
+-------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

后面再有超出长度的将报错!!!