Дані усічені для стовпця?


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
Який точний тип даних після модифікації?
Йоахім Ісакссон

3
Ви впевнені, що в колонці вказано достатньо місця для тексту такої довжини?
Джон Конде,

1
ALTER TABLES calls MODIFY incoming_Cid STRING;це те, що я зробив.
Zagstrug

Видалено попередній коментар через EDIT: Я не вказав, що рядок має бути 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' у цьому стовпці, таким чином, я отримав згаданий помилка.

Вирішено шляхом зміни визначення стовпця таблиці та доданого значення 'a' до набору перечислення.


8

Видаючи цю заяву:

ALTER TABLES call MODIFY incoming_Cid CHAR;

... ви пропустили параметр length. Тому ваш запит еквівалентний:

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),
        //
    ];
});

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'.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.