【问题标题】:How to fix MySQL Data Truncation Error when inserting a lot of data?插入大量数据时如何修复 MySQL 数据截断错误?
【发布时间】:2010-09-09 13:01:04
【问题描述】:

我正在使用来自 Java 应用程序的相当简单的数据库。我们尝试使用标准的 JDBC mysql 适配器一次插入大约 200k 的文本。我们间歇性地收到com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column error.

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

【问题讨论】:

    标签: java mysql jdbc


    【解决方案1】:

    好吧,您可以通过执行 INSERT IGNORE 使其忽略错误,这只会截断数据并插入它。 (来自http://dev.mysql.com/doc/refman/5.0/en/insert.html

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

    【讨论】:

      【解决方案2】:

      在我看来,您试图将太多字节放入一列。由于我的代码中的错误,我昨晚在 MySQL 上遇到了一个非常相似的错误。我本来打算做的

      foo.status = 'inactive'
      

      但实际输入过

      foo.state = 'inactive'
      

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

      【讨论】:

        【解决方案3】:

        检查您的 UTF-8 数据是否都是 3 字节 Unicode。如果你有 4 字节字符(在 Unicode 和 Java 中是合法的,在 MySQL 5 中是非法的),当你尝试插入它们时它会抛出这个错误。这是 MySQL 6.0 中的 issue that should be fixed

        【讨论】:

        • @JAVAGeek:好问题,应该单独提出。有多种方式。在我的脑海中,可能在 Java 中起作用的一种方法是检查字符串中是否有任何由多个字符表示的代码点,例如:s.length() == s.toCharArray().length。如果是这样,s 具有相同数量的代码点和字符,因此将仅具有以 UTF-8 表示的 BMP 字符,最多 3 个字节。
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          在mysql中你可以使用MEDIUMTEXTLONGTEXT字段类型来处理大文本数据

          【讨论】:

            猜你喜欢
            • 2017-02-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-10
            • 1970-01-01
            • 2013-02-16
            相关资源
            最近更新 更多