Я работаю с довольно простой базой данных из приложения Java. Мы пытаемся вставить около 200 КБ текста за раз, используя стандартный адаптер JDBC mysql. Мы периодически получаем com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column error.
Тип столбца - длинный текст, а параметры сортировки базы данных - UTF-8. Ошибка проявляется при использовании табличных движков MyISAM и InnoDB. Максимальный размер пакета был установлен как 1 ГБ как на стороне клиента, так и на стороне сервера, так что это тоже не должно вызывать проблем.




Что ж, вы можете заставить его игнорировать ошибку, выполнив 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.
Я просто столкнулся с этой проблемой и решил ее, удалив все нестандартные символы ascii в моем тексте (следуя совету UTF-8 выше).
У меня была проблема в системе Debian 4, Java 5; но тот же код отлично работал с Ubuntu 9.04, Java 6. Оба работают с MySql 5.
В mysql вы можете использовать тип поля MEDIUMTEXT или LONGTEXT для больших текстовых данных.
@JAVAGeek: Хороший вопрос, который, наверное, стоит задать отдельно. Есть разные способы. Вне моей головы, один из способов, который может работать в Java, - это проверить, есть ли в строке какие-либо кодовые точки, которые представлены более чем одним символом, например:
s.length() == s.toCharArray().length. Если это так,sимеет такое же количество кодовых точек и символов, поэтому будут иметь только символы BMP, представленные в UTF-8 размером до 3 байтов.