【问题标题】:Data truncated for column?列的数据被截断?
【发布时间】:2013-08-06 19:53:29
【问题描述】:

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

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

但是我得到一个错误,因为列的数据类型被正确修改,所以没有任何意义?

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

【问题讨论】:

  • 修改后的具体数据类型是什么?
  • 您确定该列已为该长度的文本指定了足够的空间吗?
  • ALTER TABLES calls MODIFY incoming_Cid STRING; 是我所做的。
  • 由于编辑删除了之前的评论:我没有指定字符串应该是 char(34) 而不是 char(1),但不知道该怎么做
  • STRING 不是 MySQL 类型。你的数据库引擎是什么?

标签: mysql warnings twilio


【解决方案1】:
推荐的答案 Twilio

您的问题是,目前您的incoming_Cid 列定义为CHAR(1),而它应该是CHAR(34)。

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

ALTER TABLE calls CHANGE incoming_Cid incoming_Cid CHAR(34);

这里是SQLFiddle演示

【讨论】:

  • 我正在为ENUM 列发送字符串,而不是整数。
  • 调用此函数时出现错误:ALTER TABLE properties CHANGE verpackt verpackt FLOAT( 10, 3 ) NOT NULL DEFAULT '0.000' - 之前是 FLOAT( 8, 3 ) NULL - 问题是,“verpackt”中已经有一些值,因此无法删除 NULL
【解决方案2】:

我遇到了同样的问题,因为表列被定义为 ENUM('x','y','z') ,后来我试图将值 'a' 保存到该列中,因此我得到了提到的错误。

通过更改表列定义并将值'a'添加到枚举集中来解决。

【讨论】:

    【解决方案3】:

    通过发布此声明:

    ALTER TABLES call MODIFY incoming_Cid CHAR;
    

    ...您省略了长度参数。因此,您的查询相当于:

    ALTER TABLE calls MODIFY incoming_Cid CHAR(1);
    

    您必须为大于 1 的大小指定字段大小:

    ALTER TABLE calls MODIFY incoming_Cid CHAR(34);
    

    【讨论】:

      【解决方案4】:

      但是我得到一个错误,因为列的数据类型被正确修改,所以没有任何意义?

      | 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 字段中,反之亦然。

      【讨论】:

        【解决方案5】:

        在我的例子中,它是一个带有 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),
                //
            ];
        });
        

        【讨论】:

          【解决方案6】:

          我遇到了同样的问题,数据库字段类型为“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
          

          所以我只需要在字段中添加附加值。

          阅读此documentation 条目帮助我理解了问题。

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

          【讨论】:

            【解决方案7】:

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

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

            那么你就可以走了。

            【讨论】:

              【解决方案8】:

              我的问题是我使用单引号而不是双引号,这会在布尔列中添加额外的单词

              【讨论】:

                【解决方案9】:

                我遇到了同样的问题。在我的情况下,我为数字列插入了一个空字符串。但是通过为同一列插入一个字符串形式的数值,它得到了解决,例如“12.56”->数字列可以工作,但是'' --> 数字列将给出上述错误。 注意:对于 MySql 中的数字列,我们也可以在双引号中传递值。

                【讨论】:

                  猜你喜欢
                  • 2011-07-30
                  • 2013-04-20
                  • 1970-01-01
                  • 2020-12-20
                  • 2021-11-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多