列被截断的数据?

时间:2013-08-06 19:53:29

标签: mysql warnings twilio

更改MySql列的数据类型以存储Twilio call ID(34个char字符串)后,我尝试手动更改该列中的数据:

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

然而,由于列的数据类型被正确修改,我得到一个没有意义的错误?

  

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

7 个答案:

答案 0 :(得分:68)

您的问题是,incoming_Cid列定义为CHAR(1)时应该是CHAR(34)

要解决此问题,只需发出此命令即可将列的长度从1更改为34

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

这是 SQLFiddle 演示

答案 1 :(得分:6)

发表此声明:

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);

答案 2 :(得分: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字段中,反之亦然。

答案 3 :(得分:4)

我遇到了同样的问题,因为表格列定义为ENUM(' x',' y'' z')以及之后的I我试图挽救价值' a'进入这一栏,因此我得到了上述错误。

通过更改表格列定义和附加值解决问题' a'进入枚举集。

答案 4 :(得分: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),
        //
    ];
});

答案 5 :(得分:1)

当我第一次尝试将csv导入mysql时,遇到了同样的错误,然后我发现我创建的mysql表没有导入csv字段的字符长度, 所以如果是第一次导入csv

  1. 给出更多字符长度是一个好主意。
  2. 将所有字段标记为varchartext,不要混合int或其他值。

那你很好。

答案 6 :(得分: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

所以我只需要向该字段添加附加值即可。

enter image description here

阅读此documentation条目有助于我理解问题。

  

MySQL以数字形式存储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”。