Ошибка усечения данных MySQL

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

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


person Community    schedule 16.09.2008    source источник


Ответы (5)


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

person Avi    schedule 16.09.2008
comment
@JAVAGeek: Хороший вопрос, который, вероятно, следует задать отдельно. Есть разные способы. На мой взгляд, один из способов, который может работать в Java, — это проверить, есть ли в строке какие-либо кодовые точки, представленные более чем одним символом, например: s.length() == s.toCharArray().length. Если это правда, s имеет такое же количество кодовых точек и символов, поэтому будет содержать только символы BMP, которые представлены в UTF-8 до 3 байтов. - person Avi; 19.07.2012

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

Если вы используете ключевое слово IGNORE, ошибки, возникающие при выполнении инструкции INSERT, вместо этого рассматриваются как предупреждения. Например, без IGNORE строка, которая дублирует существующий индекс UNIQUE или значение PRIMARY KEY в таблице, вызывает ошибку дублирования ключа, и оператор прерывается. С IGNORE строка по-прежнему не вставляется, но ошибка не выдается. Преобразования данных, которые вызовут ошибки, прерывают оператор, если IGNORE не указан. С помощью IGNORE недопустимые значения корректируются до ближайших значений и вставляются; выдаются предупреждения, но оператор не прерывается.

person Nicholas    schedule 16.09.2008

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

person grigson    schedule 16.10.2012

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

foo.status = 'inactive'

но на самом деле напечатал

foo.state = 'inactive'

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

person Aaron    schedule 16.09.2008

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

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

person Szemere    schedule 10.07.2009