Подтвердить что ты не робот

Ошибка обрыва данных MySQL

Я работаю с довольно простой базой данных из приложения Java. Мы пытаемся вставить около 200 тыс. Текста за раз, используя стандартный JDBC-адаптер mysql. Мы прерывисто получаем com.mysql.jdbc.MysqlDataTruncation: Усечение данных: слишком длинны данные для ошибки столбца.

Тип столбца - longtext, а сортировка базы данных - UTF-8. Ошибка отображается с использованием табличных движков MyISAM и InnoDB. Максимальный размер пакета был установлен с 1 ГБ на стороне клиента и сервера, так что это также не должно вызывать проблемы.

4b9b3361

Ответ 1

Убедитесь, что ваши данные UTF-8 - это 3-байтовый Unicode. Если у вас есть 4-байтовые символы (законные в Unicode и Java, незаконные в MySQL 5), он может выбросить эту ошибку при попытке вставить их. Это проблема которая должна быть исправлена ​​ в MySQL 6.0.

Ответ 2

Ну, вы можете заставить его игнорировать ошибку, выполнив INSERT IGNORE, который будет просто усекать данные и вставить их в любом случае. (от http://dev.mysql.com/doc/refman/5.0/en/insert.html)

Если вы используете ключевое слово IGNORE, ошибки которые происходят во время выполнения INSERT выражение рассматриваются как предупреждения вместо. Например, без IGNORE, строка, которая дублирует существующую УНИКАЛЬНЫЙ индекс или значение PRIMARY KEY в таблица вызывает ошибку с повторяющимся ключом и утверждение прерывается. С IGNORE, строка все еще не вставлена, но ошибки не выдаются. Данные конверсий, которые будут вызывать ошибки прервать утверждение, если IGNORE не указано. С IGNORE недопустимые значения скорректированы до ближайших значений и вставлен; предупреждения производятся, но утверждение не прерывается.

Ответ 3

В mysql вы можете использовать тип поля MEDIUMTEXT или LONGTEXT для больших текстовых данных

Ответ 4

Мне кажется, что вы пытаетесь переложить слишком много байтов в столбец. Вчера я столкнулся с очень похожей ошибкой с MySQL из-за ошибки в моем коде. Я хотел сделать

foo.status = 'inactive'

но на самом деле набрал

foo.state = 'inactive'

Где foo.state должен быть двухсимвольным кодом для американского штата (varchar (2)). Я получил ту же ошибку, что и вы. Вы можете искать аналогичную ситуацию в своем коде.

Ответ 5

Я просто ударил эту проблему и решил ее, удалив все нестандартные символы ascii в моем тексте (следуя приведенным выше рекомендациям UTF-8).

У меня возникла проблема в системе Debian 4, Java 5; но тот же код отлично работал с Ubuntu 9.04, Java 6. Оба запускают MySql 5.