Rootop 服务器运维与web架构

mysql5.6数据库varchar类型超过字段长度自动截取的问题

帮群里处理一个问题,说是前台页面post提交的数据,其中一个字段的字符串超过数据库中字段的最大长度限制后出现自动截取的结果。
最终数据库里存的数据为这个字段的最大长度,其余的自动截取了。在我印象里超过长度应该是报错的。

特地研究了一下。
比如有个字段为varchar类型,长度10。当写入数据的时候,mysql5.6和mysql5.7处理方式不一样。
具体原因是由sql_mode模式决定的。

5.7版本插入一串字符串长度为11时,会报错:1406 Data too long for column ‘字段名’。
5.6版本插入时,则会截取到10个字符的长度。

5.7文档中默认的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

5.6文档中默认的sql-mode值为:

NO_ENGINE_SUBSTITUTION

参考:
https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
https://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html

当在修改数据库sql-mode模式为 “严格模式” 时,发现用数据库客户端软件测试没效果。

/etc/my.cnf:

[mysqld]
sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

# 最后查进程发现是启动参数里带着sql-mode参数,那么应该是启动脚本里定义的,优先级高于配置文件中。

[root@MiWiFi-RA69-srv mysql]# ps aux | grep mysql
root     29328  0.6  0.0  11820  1580 pts/1    S    13:41   0:00 /bin/sh /www/server/mysql/bin/mysqld_safe --datadir=/www/server/data --pid-file=/www/server/data/MiWiFi-RA69-srv.pid --sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
mysql    29946  8.0  9.0 1297996 327088 pts/1  Sl   13:41   0:00 /www/server/mysql/bin/mysqld --basedir=/www/server/mysql --datadir=/www/server/data --plugin-dir=/www/server/mysql/lib/plugin --user=mysql --sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION --log-error=MiWiFi-RA69-srv.err --open-files-limit=65535 --pid-file=/www/server/data/MiWiFi-RA69-srv.pid --socket=/tmp/mysql.sock --port=3306

# 检查启动脚本

[root@MiWiFi-RA69-srv mysql]# vi /etc/init.d/mysqld 
other_args= #--sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"   # uncommon, but needed when called from an RPM upgrade action

把他注释掉再重启mysql,再次查看进程信息里没有sql-mode参数了。

sql-mode不同值的含义或者直接找百度翻译版:
https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html
https://dev.mysql.com/doc/refman/5.6/en/sql-mode.html

然后再次测试插入过长数据时,就提示错误了。
PS:
我在用sqlyog客户端测的时候发现设置了sql-mode 后通过 “select @@sql_mode;” 取不到设置的值。
但是用navicat可以查到。推测sqlyog连接的时候给临时设置了模式,又浪费了一段时间。

原创文章,转载请注明。本文链接地址: https://www.rootop.org/pages/4968.html

作者:Venus

专注于 服务器运维与web架构 E-mail:venus#rootop.org

评论已关闭。