Данные для столбца усечены?

90

После изменения типа данных столбца MySql для хранения идентификаторов вызовов Twilio (34 строки символов) я пытаюсь вручную изменить данные в этом столбце с помощью:

update calls 
   set incoming_Cid='CA9321a83241035b4c3d3e7a4f7aa6970d' 
 where id='1';

Однако я получаю сообщение об ошибке, которое не имеет смысла, поскольку тип данных столбца был правильно изменен?

| Level ||| Code | Message | Warning | 1265 | Data truncated for column 'incoming_Cid' at row 1

Загструг
источник
2
Каков точный тип данных после модификации?
Joachim Isaksson
3
Вы уверены, что в этом столбце достаточно места для текста такой длины?
Джон Конде
1
ALTER TABLES calls MODIFY incoming_Cid STRING;это то, что я сделал.
Zagstrug 06
Удален предыдущий комментарий из-за РЕДАКТИРОВАНИЯ: я не указал, что строка должна быть char (34) вместо char (1), но не знаю, как это сделать
Zagstrug
STRINGне является типом MySQL. Какой у вас движок базы данных?
RandomSeed

Ответы:

83

Ваша проблема в том, что на данный момент ваш incoming_Cidстолбец определен так, как CHAR(1)должен CHAR(34).

Чтобы исправить это, просто введите эту команду, чтобы изменить длину столбцов с 1 до 34.

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

Вот демонстрация SQLFiddle

Петерм
источник
13

У меня была такая же проблема из-за столбца таблицы, который был определен как ENUM ('x', 'y', 'z'), а позже я пытался сохранить значение 'a' в этом столбце, поэтому я получил упомянутый ошибка.

Решено путем изменения определения столбца таблицы и добавления значения «а» в набор перечислений.

МТурПаш
источник
8

Выпуская это заявление:

ALTER TABLES call MODIFY incoming_Cid CHAR;

... вы пропустили параметр длины. Таким образом, ваш запрос был эквивалентен:

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

Вы должны указать размер поля для размеров больше 1:

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);
Случайное семя
источник
5

Однако я получаю сообщение об ошибке, которое не имеет смысла, поскольку тип данных столбца был правильно изменен?

| Level | Code | Msg | Warn | 12 | Data truncated for column 'incoming_Cid' at row 1

Вы часто можете получить это сообщение, когда делаете что-то вроде следующего:

REPLACE INTO table2 (SELECT * FROM table1);

Вызвало в нашем случае следующую ошибку:

SQL Exception: Data truncated for column 'level' at row 1

Проблема оказалась в несовпадении столбцов, что привело к tinyintпопытке сохранения в datetimeполе или наоборот.

Серый
источник
1

В моем случае это была таблица с ENUM, которая принимает дни недели как целые числа (от 0 до 6). При вставке значения 0 как целого числа я получил сообщение об ошибке «Данные усечены для столбца ...», поэтому, чтобы исправить это, мне пришлось преобразовать целое число в строку. Так что вместо:

$item->day = 0;

Я должен был сделать;

$item->day = (string) 0;

Выглядит глупо так бросать ноль, но в моем случае это было на фабрике Laravel, и мне пришлось написать это так:

$factory->define(App\Schedule::class, function (Faker $faker) {
    return [
        'day' => (string) $faker->numberBetween(0, 6),
        //
    ];
});
iSWORD
источник
1

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

  1. Хорошая идея - увеличить длину символа.
  2. пометьте все поля как varcharили text, не смешивайте intили другие значения.

тогда вам хорошо идти.

Саиджон
источник
0

У меня была та же проблема с полем базы данных типа «SET», которое является типом перечисления.

Я попытался добавить значение, которого не было в этом списке.

Значение, которое я пытался добавить, имело десятичное значение 256, но в списке перечислений было только 8 значений.

1: 1   -> A
2: 2   -> B
3: 4   -> C
4: 8   -> D
5: 16  -> E
6: 32  -> F
7: 64  -> G
8: 128 -> H

Поэтому мне просто нужно было добавить дополнительное значение в поле.

введите описание изображения здесь

Чтение этой записи в документации помогло мне понять проблему.

MySQL сохраняет значения SET в числовом виде, при этом младший бит сохраненного значения соответствует первому члену набора. Если вы получаете значение SET в числовом контексте, полученное значение имеет набор битов, соответствующих элементам набора, которые составляют значение столбца. Например, вы можете получить числовые значения из столбца SET следующим образом:

mysql> SELECT set_col+0 FROM tbl_name; If a number is stored into a

Если число хранится в столбце SET, биты, которые установлены в двоичном представлении числа, определяют элементы набора в значении столбца. Для столбца, указанного как SET ('a', 'b', 'c', 'd'), члены имеют следующие десятичные и двоичные значения.

SET Member  Decimal Value   Binary Value
    'a'                1          0001
    'b'                2          0010
    'c'                4          0100
    'd'                8          1000

Если вы присвоите этому столбцу значение 9, то это будет 1001 в двоичном формате, поэтому будут выбраны первый и четвертый члены значения SET «a» и «d», и результирующее значение будет «a, d».

Черный
источник