我正在使用一个相当简单的数据库,来自Java应用程序。我们尝试使用标准的JDBC mysql适配器一次插入大约200k的文本。我们间歇性地得到一个com.mysql.jdbc.MysqlDataTruncation:数据截断:列错误的数据太长。
列类型为longtext,数据库排序规则为UTF-8。使用MyISAM和InnoDB表引擎显示错误。客户端和服务器端的最大数据包大小已设置为1 GB,因此也不会导致问题。
答案 0 :(得分:10)
检查您的UTF-8数据是否都是3字节Unicode。如果您有4字节字符(在Unicode和Java中是合法的,在MySQL 5中是非法的),当您尝试插入它们时,它会抛出此错误。这是MySQL 6.0中的issue that should be fixed。
答案 1 :(得分:4)
好吧,你可以通过执行INSERT IGNORE来忽略错误,它只是截断数据并插入它。 (来自http://dev.mysql.com/doc/refman/5.0/en/insert.html)
如果使用IGNORE关键字,则会出错 执行INSERT时发生的情况 声明被视为警告 代替。例如,没有IGNORE, 一个复制现有的行 UNIQUE索引或PRIMARY KEY值 该表导致重复键错误 声明中止。同 IGNORE,行仍未插入, 但没有发出错误。数据 转换会触发错误 如果IGNORE不是,则中止该声明 指定。使用IGNORE时,值无效 调整到最接近的值和 插入;制作警告但是 声明不会中止。
答案 2 :(得分:4)
在mysql中,您可以将MEDIUMTEXT
或LONGTEXT
字段类型用于大型文本数据
答案 3 :(得分:2)
听起来我正在尝试将太多字节放入列中。由于我的代码中存在错误,我昨晚遇到了与MySQL非常类似的错误。我的意思是
foo.status = 'inactive'
但实际输入了
foo.state = 'inactive'
其中foo.state应该是美国州的两个字符代码(varchar(2))。我和你有同样的错误。您可能会在代码中寻找类似的情况。
答案 4 :(得分:1)
我刚刚遇到这个问题并通过删除文本中的所有非标准ascii字符解决了这个问题(遵循上面的UTF-8建议)。
我在Debian 4,Java 5系统上遇到了问题;但是相同的代码在Ubuntu 9.04,Java 6中运行良好。两者都运行MySql 5.