列的数据被截断了吗?


90

在更改MySql列的数据类型以存储Twilio调用ID(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

由于编辑原因删除了先前的评论:我尚未指定字符串应为char(34)而不是char(1),但不知道该怎么做
Zagstrug

STRING不是MySQL类型。您的数据库引擎是什么?
2013年

Answers:


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. 将所有字段标记为varchartext,请勿混合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值,则检索到的值具有与组成列值的set成员相对应的位set。例如,您可以像这样从SET列中检索数值:

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

如果将数字存储到SET列中,则以该数字的二进制表示形式设置的位将确定列值中的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'。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.