场景
开发环境中进行更新数据库中的数据时,偶然发现数据超过varchar的长度,数据库没有报错,而是自动进行了数据截取并保存了.
原因
经过确认,是因为sql_mode
的设置导致的,
select @@SESSION.sql_mode
因为没有设置严格模式,所以更新成功.
设置为严格模式:
SET SESSION sql_mode = 'STRICT_TRANS_TABLES';
直接更新失败.
ANSI 如果不设置模式,默认就是这个
ANSI模式:宽松模式,对插入数据进行校验,如果不符合定义类型或长度,对数据类型调整或截断保存,报warning警告。
TRADITIONAL
TRADITIONAL 模式:严格模式,当向mysql数据库插入数据时,进行数据的严格校验,保证错误数据不能插入,报error错误。用于事物时,会进行事物的回滚。
STRICT_TRANS_TABLES
STRICT_TRANS_TABLES模式:严格模式,进行数据的严格校验,错误数据不能插入,报error错误。
结尾
如果需要设置严格模式,建议修改数据库配置my.cnf
里的sql_mode
,重启数据后永久有效.