MySQL 太长 varchar 截断/错误设置

Posted

技术标签:

【中文标题】MySQL 太长 varchar 截断/错误设置【英文标题】:MySQL too long varchar truncation/error setting 【发布时间】:2013-08-29 19:57:26 【问题描述】:

我有两个 mysql 实例。当数据太长时,第一个在插入时截断字符串。第二个引发错误:

ERROR 1406 (22001): Data too long for column 'xxx' at row 1

我希望第二个也截断数据。 是否有任何 MySQL 设置来管理此行为?

【问题讨论】:

列的文件类型和长度是多少?对于两台服务器上的相同文件,您是否具有相同的值 @metalfight-user868766 不明白您关于文件类型的问题。引擎是 InnoDB,列类型 - varchar。列的长度没有变化。是的,数据库几乎完全相同。 我认为列的长度很重要,VARCHAR 类型的声明长度表示要存储的最大字符数。您的字符串是否大于 varchar 字段的长度 @metalfight-user868766 他知道字符串比声明的长度长。问题是他如何控制这是否会导致错误或导致值被截断为声明的长度。 尝试禁用STRICT_TRANS_TABLESSTRICT_ALL_TABLES 参考这里dev.mysql.com/doc/refman/5.0/en/… 【参考方案1】:

您可以禁用STRICT_TRANS_TABLESSTRICT_ALL_TABLES。这允许自动截断插入的字符串。

引自 MySQL 文档。

严格模式控制 MySQL 如何处理无效或缺失值 数据更改语句,例如 INSERT 或 UPDATE。一个值可以是 由于几个原因无效。例如,它可能有错误的数据 列的类型,否则可能超出范围。缺少一个值 当要插入的新行不包含非 NULL 值时 在其定义中没有显式 DEFAULT 子句的列。 (为一个 NULL 列,如果缺少值,则插入 NULL。)

参考:MySQL Server SQL Modes

【讨论】:

这也是我的问题的答案 BTW - 下面的方法不应该被认为是有效的 - 你需要在你的 my.cnf 中设置 sql-mode - 但你不需要 NO_AUTO_CREATE_USER 或任何其他,你只需要确保您没有 STRICT_TRANS_TABLES 或 STRICT_ALL_TABLES 或其他任何传播此警告的东西。事实上 sql-mode='' 也可以修复错误。【参考方案2】:

如果未启用严格的 SQL 模式,并且您为 CHAR 或 VARCHAR 列分配的值超过了列的最大长度,则该值将被截断以适应并生成警告。对于非空格字符的截断,您可能会导致发生错误(而不是警告)并使用严格的 SQL 模式禁止插入值。请参阅第 6.1.7 节,“服务器 SQL 模式”。

如何改变它: http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html


找到了两种禁用严格模式的方法:

    将以下内容添加到 my.cnf

    sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

    方式是使用mysql控制台。

    SET @@global.sql_mode= '';

请在生产环境中运行之前对其进行测试。

【讨论】:

【参考方案3】:

如果你使用 cpanel ,

替换

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

进入/usr/my.cnf

sql-mode=""

运行

/etc/init.d/mysql restart

【讨论】:

以上是关于MySQL 太长 varchar 截断/错误设置的主要内容,如果未能解决你的问题,请参考以下文章

错误:#1071 - 指定的密钥太长;最大密钥长度为 1000 字节 - mysql 5.0.91

数据截断:第 1 行的“logo”列数据太长

mysql中varcharchartext的使用

8.Mysql数据类型选择

SQL 错误 #1071 - 指定的键太长;最大密钥长度为 767 字节

字符串“abcdfghrdfthgywdcgrt”太长,将被截断