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

Я работаю с довольно простой базой данных из приложения Java. Мы пытаемся вставить около 200 КБ текста за раз, используя стандартный адаптер JDBC mysql. Мы периодически получаем com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column error.

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
11
0
43 749
5

Ответы 5

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

If you use the IGNORE keyword, errors that occur while executing the INSERT statement are treated as warnings instead. For example, without IGNORE, a row that duplicates an existing UNIQUE index or PRIMARY KEY value in the table causes a duplicate-key error and the statement is aborted. With IGNORE, the row still is not inserted, but no error is issued. Data conversions that would trigger errors abort the statement if IGNORE is not specified. With IGNORE, invalid values are adjusted to the closest values and inserted; warnings are produced but the statement does not abort.

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

foo.status = 'inactive'

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

foo.state = 'inactive'

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

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

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

Avi 19.07.2012 09:59

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

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

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

Другие вопросы по теме