MySQL数据截断错误

时间:2008-09-16 14:44:37

标签: java mysql jdbc

我正在使用一个相当简单的数据库,来自Java应用程序。我们尝试使用标准的JDBC mysql适配器一次插入大约200k的文本。我们间歇性地得到一个com.mysql.jdbc.MysqlDataTruncation:数据截断:列错误的数据太长。

列类型为longtext,数据库排序规则为UTF-8。使用MyISAM和InnoDB表引擎显示错误。客户端和服务器端的最大数据包大小已设置为1 GB,因此也不会导致问题。

5 个答案:

答案 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中,您可以将MEDIUMTEXTLONGTEXT字段类型用于大型文本数据

答案 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.