Dados truncados para a coluna?

90

Depois de alterar o tipo de dados de uma coluna MySql para armazenar ids de chamada Twilio (strings de 34 caracteres), tento alterar manualmente os dados nessa coluna com:

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

No entanto, recebo um erro que não faz sentido, visto que o tipo de dados da coluna foi modificado corretamente.

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

Zagstrug
fonte
2
Qual é o tipo de dados exato após a modificação?
Joachim Isaksson
3
Tem certeza de que a coluna especificou espaço suficiente para o texto desse comprimento?
John Conde
1
ALTER TABLES calls MODIFY incoming_Cid STRING;é o que eu fiz.
Zagstrug
Comentário anterior excluído devido a EDIT: Eu não especifiquei que a string deveria ser char (34) em vez de char (1), mas não sei como fazer isso
Zagstrug
STRINGnão é um tipo de MySQL. Qual é o seu mecanismo de banco de dados?
RandomSeed

Respostas:

83

Seu problema é que no momento sua incoming_Cidcoluna definiu como CHAR(1)deveria estar CHAR(34).

Para corrigir isso, basta emitir este comando para alterar o comprimento das colunas de 1 para 34

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

Aqui está a demonstração SQLFiddle

peterm
fonte
13

Eu tive o mesmo problema por causa de uma coluna da tabela que foi definida como ENUM ('x', 'y', 'z') e mais tarde eu estava tentando salvar o valor 'a' nesta coluna, então eu obtive o mencionado erro.

Resolvido alterando a definição da coluna da tabela e valor agregado 'a' no conjunto enum.

MTurPash
fonte
8

Ao emitir esta declaração:

ALTER TABLES call MODIFY incoming_Cid CHAR;

... você omitiu o parâmetro de comprimento. Sua consulta foi, portanto, equivalente a:

ALTER TABLE calls MODIFY incoming_Cid CHAR(1);

Você deve especificar o tamanho do campo para tamanhos maiores que 1:

ALTER TABLE calls MODIFY incoming_Cid CHAR(34);
RandomSeed
fonte
5

No entanto, recebo um erro que não faz sentido, visto que o tipo de dados da coluna foi modificado corretamente.

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

Muitas vezes, você pode receber essa mensagem quando está fazendo algo como o seguinte:

REPLACE INTO table2 (SELECT * FROM table1);

Resultou em nosso caso no seguinte erro:

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

O problema acabou por ser o desalinhamento da coluna que resultou na tinyinttentativa de ser armazenado em um datetimecampo ou vice-versa.

cinzento
fonte
1

No meu caso era uma tabela com um ENUM que aceita os dias da semana como inteiros (0 a 6). Ao inserir o valor 0 como um inteiro, recebi a mensagem de erro "Dados truncados para a coluna ...", então, para corrigi-lo, tive que converter o inteiro em uma string. Então, em vez de:

$item->day = 0;

Eu tive que fazer;

$item->day = (string) 0;

Parece bobagem lançar o zero assim, mas no meu caso foi em uma fábrica do Laravel e tive que escrever assim:

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

quando tentei importar o csv para o mysql pela primeira vez, obtive o mesmo erro e, em seguida, descobri que a tabela do mysql que criei não tem o comprimento de caracteres do campo csv de importação, então, se for a primeira vez, importando csv

  1. é uma boa ideia fornecer mais comprimento de caracteres.
  2. rotule todos os campos como varcharou text, não combine intou outros valores.

então você está pronto para ir.

Saidjon
fonte
0

Eu tive o mesmo problema, com um campo de banco de dados com o tipo "SET" que é um tipo de enum.

Tentei adicionar um valor que não estava nessa lista.

O valor que tentei adicionar tinha o valor decimal 256, mas a lista de enum tinha apenas 8 valores.

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

Então, eu apenas tive que adicionar o valor adicional ao campo.

insira a descrição da imagem aqui

Ler esta entrada da documentação me ajudou a entender o problema.

O MySQL armazena valores SET numericamente, com o bit de ordem inferior do valor armazenado correspondendo ao primeiro membro do conjunto. Se você recuperar um valor SET em um contexto numérico, o valor recuperado terá um conjunto de bits correspondente aos membros do conjunto que constituem o valor da coluna. Por exemplo, você pode recuperar valores numéricos de uma coluna SET como este:

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

Se um número for armazenado em uma coluna SET, os bits que são definidos na representação binária do número determinam os membros do conjunto no valor da coluna. Para uma coluna especificada como SET ('a', 'b', 'c', 'd'), os membros têm os seguintes valores decimais e binários.

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

Se você atribuir um valor de 9 a esta coluna, isso é 1001 em binário, então o primeiro e o quarto membros do valor SET 'a' e 'd' são selecionados e o valor resultante é 'a, d'.

Preto
fonte