Ошибка усечения данных MySQL - PullRequest
11 голосов
/ 16 сентября 2008

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

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

Ответы [ 5 ]

10 голосов
/ 16 сентября 2008

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

4 голосов
/ 16 октября 2012

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

4 голосов
/ 16 сентября 2008

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

Если вы используете ключевое слово IGNORE, ошибки которые происходят во время выполнения ВСТАВКИ Заявление рассматривается как предупреждение вместо. Например, без IGNORE, строка, которая дублирует существующий УНИКАЛЬНЫЙ индекс или значение ПЕРВИЧНОГО КЛЮЧА в таблица вызывает ошибку двойного ключа и заявление отменяется. С IGNORE, строка все еще не вставлена, но ошибка не выдается. Данные конверсии, которые могут вызвать ошибки прервать утверждение, если IGNORE не указано. С IGNORE, недопустимые значения корректируются до ближайших значений и вставлен; предупреждения производятся, но утверждение не прерывается.

2 голосов
/ 16 сентября 2008

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

foo.status = 'inactive'

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

foo.state = 'inactive'

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

1 голос
/ 10 июля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...