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

"Данные слишком длинны для столбца" - почему?

Я написал сценарий MySQL, чтобы создать базу данных для гипотетических больничных записей и заполнить ее данными. В одной из таблиц Department есть столбец Description, который объявлен как тип varchar (200). При выполнении команды INSERT для Description я получаю сообщение об ошибке:

ошибка 1406: слишком длинные данные для столбца "Описание" в строке 1.

Все строки, которые я вставляю, содержат менее 150 символов.

Вот декларация:

CREATE TABLE Department(
    ...
    Description varchar(200)
    ...);

И вот команда вставки:

INSERT INTO Department VALUES
(..., 'There is some text here',...), (..., 'There is some more text over here',...);

Судя по всему, это должно работать. У кого-нибудь есть понимание?

4b9b3361

Ответ 1

Измените тип столбца на LONGTEXT

Ответ 3

Существует жесткий предел того, сколько данных может храниться в одной строке таблицы mysql, независимо от количества столбцов или отдельной длины столбца.

Как указано в ОФИЦИАЛЬНОЙ ДОКУМЕНТАЦИИ

Максимальный размер строки ограничивает число (и, возможно, размер) столбцов, потому что общая длина всех столбцов не может превышать этот размер. Например, для символов utf8 требуется до трех байтов на символ, поэтому для столбца CHAR (255) CHARACTER SET utf8 сервер должен выделять 255 × 3 = 765 байтов на каждое значение. Следовательно, таблица не может содержать более 65535/765 = 85 таких столбцов.

Хранение столбцов переменной длины включает байты длины, которые оцениваются по размеру строки. Например, столбец VARCHAR (255) CHARACTER SET utf8 принимает два байта для хранения длины значения, поэтому каждое значение может занимать до 767 байт.

Здесь вы можете найти ОГРАНИЧЕНИЯ ВНУТРЕННЕЙ ТАБЛИЦЫ

Ответ 4

Оказывается, как это часто бывает, это была глупая ошибка с моей стороны. То, как я тестировал это, я не перестраивал таблицу Департамента после изменения типа данных из varchar (50) в varchar (200); Я просто перезапустил команду insert, все еще с столбцом как varchar (50).

Ответ 5

У Varchar есть свои пределы. Возможно, попробуйте изменить тип данных на текст.!

Ответ 6

С Hibernate вы можете создать свой собственный UserType. Так вот что я сделал для этой проблемы. Что-то простое:

    public class BytesType implements org.hibernate.usertype.UserType {

         private final int[] SQL_TYPES = new int[] { java.sql.Types.VARBINARY };
     //...
    }

Конечно, для расширения вашего собственного UserType, скорее всего, нужно просто отбросить его для тех, кто ищет другие методы.

Ответ 7

Я пытаюсь создать таблицу с полем как 200 символов, и я добавил две строки с ранними 160 символами, и все в порядке. Вы уверены, что ваши строки меньше 200 символов?

Показать SqlFiddle

Ответ 8

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

Ответ 9

Если ваши исходные данные больше целевого поля, и вы просто хотите обрезать лишние символы, но не хотите выключать строгий режим или изменять размер целевого поля, просто обрежьте данные до нужного размера. с LEFT(field_name,size).

INSERT INTO Department VALUES
(..., LEFT('There is some text here',30),...), (..., LEFT('There is some more text over here',30),...);

Я использовал "30" в качестве примера размера целевого поля.

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

Ответ 10

Очень старый вопрос, но я попробовал все предложенное выше и все еще не мог решить его.

Оказывается, у меня был триггер после вставки/обновления для основной таблицы, который отслеживал изменения, вставляя запись в таблицу истории, имеющую аналогичную структуру. Я увеличил размер столбца основной таблицы, но забыл изменить размер столбца таблицы истории, и это создало проблему.

Я сделал аналогичные изменения в другой таблице, и ошибка исчезла.