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_TABLES
和STRICT_ALL_TABLES
参考这里dev.mysql.com/doc/refman/5.0/en/…
【参考方案1】:
您可以禁用STRICT_TRANS_TABLES
和STRICT_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