MySQL数据截断错误

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

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

检查您的UTF-8数据是否都是3字节Unicode。 如果您有4个字节的字符(在Unicode和Java中是合法的,在MySQL 5中是非法的),当您尝试插入它们时,它会抛出此错误。 这是一个应该在MySQL 6.0中修复的问题 。

那么你可以通过执行一个INSERT IGNORE来忽略错误,它只会截断数据并插入它。 (来自http://dev.mysql.com/doc/refman/5.0/en/insert.html )

如果使用IGNORE关键字,则执行INSERT语句时发生的错误将被视为警告。 例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,并且语句将中止。 使用IGNORE时,仍未插入行,但未发出错误。 如果未指定IGNORE,则会触发错误的数据转换会中止语句。 使用IGNORE,将无效值调整为最接近的值并插入; 产生警告,但声明不会中止。

在mysql中,您可以将MEDIUMTEXTLONGTEXT字段类型用于大型文本数据

听起来像你试图将太多字节放入一列。 由于我的代码中存在错误,我昨晚遇到了与MySQL非常类似的错误。 我打算做

 foo.status = 'inactive' 

但实际打字了

 foo.state = 'inactive' 

其中foo.state应该是美国州的两个字符代码(varchar(2))。 我得到了和你一样的错误。 您可能会在代码中寻找类似的情况。

我刚刚解决了这个问题并通过删除我的文本中的所有非标准ascii字符解决了它(遵循上面的UTF-8建议)。

我在Debian 4,Java 5系统上遇到了问题; 但是相同的代码在Ubuntu 9.04,Java 6中运行良好。两者都运行MySql 5。