[Mysql]由Data truncated for column联想到的sql_mode配置
时间:2022-03-14 03:28
系统日志中出现了
ata truncated for column ‘agent‘ at row 1
mysql出现这个问题的原因,无非就是字符集设置 或者是 字段过长导致的。
mysql在初始化的时候已经统一为utf-8了,所以可以忽略这个问题。字符串过长从而导入插入失败 一种方式是修改字段长度,可是我这个字段没法知道到底多长存储合适,不太好 一种方式是在程序中截取字符串,这个方法可行,也比较好。
但是我又想了想,以前的时候为啥会自动截断,这次就插入不进去了了呢? 原因是mysql的sql_mode设置的问题,那么就来看看这个配置项吧。
先来看看myql信息
版本 | version | 5.0.77-log查看sqlmode设置
mysql> SHOW GLOBAL VARIABLES LIKE ‘%sql_mode%‘; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | sql_mode | | +---------------+-------+ 1 row in set也可以这个么查询 mysql> SELECT @@global.sql_mode; +-------------------+ | @@global.sql_mode | +-------------------+ | | +-------------------+ 1 row in set
默认这项是空的,在这种设置下是可以允许一些非法操作的,比如允许一些非法数据的插入。 这个应该是数据库初始化应该做的工作,这里就是经验的不足。
看下官方文档: 设置项很多,根据需要选择级就可以了。
ANSI:等同于REAL_AS_FLOAT、PIPES_AS_CONCAT和ANSI_QUOTES、IGNORE_SPACE的组合。
ORACLE:等同于PIPES_AS_CONCAT、 ANSI_QUOTES、IGNORE_SPACE、 NO_KEY_OPTIONS、 NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS和NO_AUTO_CREATE_USER的组合。 TRADITIONAL:等同于STRICT_TRANS_TABLES、 STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE、 ERROR_FOR_DIVISION_BY_ZERO、NO_AUTO_CREATE_USER和 NO_ENGINE_SUBSTITUTION的组合。 MSSQL:等同于PIPES_AS_CONCAT、 ANSI_QUOTES、 IGNORE_SPACE、NO_KEY_OPTIONS、NO_TABLE_OPTIONS和 NO_FIELD_OPTIONS的组合。 DB2:等同于PIPES_AS_CONCAT、ANSI_QUOTES、 IGNORE_SPACE、NO_KEY_OPTIONS、 NO_TABLE_OPTIONS和NO_FIELD_OPTIONS的组合。 MYSQL323:等同于NO_FIELD_OPTIONS和HIGH_NOT_preCEDENCE的组合。 MYSQL40:等同于NO_FIELD_OPTIONS和HIGH_NOT_preCEDENCE的组合。 MAXDB:等同于PIPES_AS_CONCAT、ANSI_QUOTES、IGNORE_SPACE、NO_KEY_OPTIONS、 NO_TABLE_OPTIONS、 NO_FIELD_OPTIONS和 NO_AUTO_CREATE_USER的组合。
修改配置:
首先设置本次mysql进程有效,然后在配置文件中在设置,保证一直生效,我想让myql截取保存,所以用ansi模式。当前进程
mysql> set global sql_mode='PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER';
配置文件
sql-mode='PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER'
设置完之后进入mysq检查一下
参考:
本文出自 博客,转载请务必保留此出处
作者 采用协议