错误代码:1406。列的数据太长 - MySQL

时间:2013-04-11 12:39:50

标签: mysql sql sql-server

错误代码:1406。列

的数据太长
CREATE  TABLE `TEST` 
(

  `idTEST` INT NOT NULL ,

  `TESTcol` VARCHAR(45) NULL ,

  PRIMARY KEY (`idTEST`) 
);

现在Insert有些值

INSERT INTO TEST
VALUES
(
    1,
    'Vikas'
)

select 

SELECT * FROM TEST;

插入超过length

的记录
INSERT INTO TEST
VALUES
(
    2,
    'Vikas Kumar Gupta Kratika Shukla Kritika Shukla'
)

如果我们select length

SELECT LENGTH('Vikas Kumar Gupta Kratika Shukla Kritika Shukla')

 '47'

它显示错误消息

错误代码:1406。列

的数据太长

但我的期望是,我想在表格中插入至少前45个字符

如果问题不明确,请告诉我。

我知道这个错误的原因。我试图插入超过数据类型长度的值。

我想在MySQL中使用解决方案,因为MS SQL可以实现。所以我希望它也可以在 MySQL

9 个答案:

答案 0 :(得分:56)

MySQL将截断超出指定列宽的任何插入值。

要做到这一点没有错误,请尝试将SQL mode切换为不使用STRICT

Mysql reference manual


编辑:

更改模式

这可以通过两种方式完成:

  1. 在MySQL安装目录中打开my.ini(Windows)或my.cnf(Unix)文件,然后查找“sql-mode”文本。
  2. 查找

    代码:

    # Set the SQL mode to strict 
    sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    

    替换为:

    代码:

    # Set the SQL mode to strict 
    sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    

    或者

    1. 您可以在数据库管理工具中运行SQL查询,例如phpMyAdmin:
    2. 代码:

      SET @@global.sql_mode= '';
      

答案 1 :(得分:1)

我认为关闭STRICT模式不是一个好选择,因为应用程序可能会开始丢失用户输入的数据。

如果您从应用程序收到TESTcol的值,您可以添加模型验证,例如在Rails中

validates :TESTcol, length: { maximum: 45 }

如果使用SQL脚本中的值进行操作,则可以使用SUBSTRING命令截断字符串

INSERT INTO TEST
VALUES
(
    1,
    SUBSTRING('Vikas Kumar Gupta Kratika Shukla Kritika Shukla', 0, 45)
);

答案 2 :(得分:1)

这最近发生在我身上。 我已完全迁移到MySQL 5.7,所有内容均处于默认配置。

以前所有的答案都已经清楚了,我只想添加一些内容。

此1406错误也可能发生在您的函数/过程中,不仅发生在表的列长上。

对于我来说,我已经使用IN参数varchar(16)触发了哪个调用过程,但是接收到32个长度值。

我希望这可以帮助遇到类似问题的人。

答案 3 :(得分:0)

这是我对ubuntu使用的步骤。它将允许您从输入中插入超过45个字符,但是MySQL会将文本切割为45个字符以插入数据库。

  1. 运行命令

      

    sudo nano /etc/mysql/my.cnf

  2. 然后粘贴此代码

      

    [mysqld]   sql-mode =“ NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION”

  3. 重启MySQL

      

    sudo服务mysql重新启动;

答案 4 :(得分:0)

除了上面给出的答案外,我只想补充一下,导入带有不正确的行终止字符的数据时也会发生此错误。

例如,我在Windows中以csv格式保存转储文件。然后在导入

LOAD DATA INFILE '/path_to_csv_folder/db.csv' INTO TABLE table1
 FIELDS TERMINATED BY ',' 
 ENCLOSED BY '"'
 ESCAPED BY '"'
 LINES TERMINATED BY '\n'
IGNORE 1 LINES;

在我使用\ n时,Windows将行尾保存为\ r \ n(即CF LF)。我疯了,为什么phpMyAdmin能够导入文件而我却不能。仅当我在notepadd ++中打开文件并看到文件结尾时,我才意识到mysql无法找到任何以行结尾的符号(而且我猜想它会将所有行都视为该字段的输入;使它抱怨)。

从\ n到\ r \ n的任何情况;它像魅力一样工作。

LOAD DATA INFILE '/path_to_csv_folder/db.csv' INTO TABLE table1
 FIELDS TERMINATED BY ',' 
 ENCLOSED BY '"'
 ESCAPED BY '"'
 LINES TERMINATED BY '\r\n'
IGNORE 1 LINES;

答案 5 :(得分:0)

在Django中使用imagefield时遇到了相同的错误。 post_picture = models.ImageField(upload_to='home2/khamulat/mydomain.com/static/assets/images/uploads/blog/%Y/%m/%d', height_field=None, default=None, width_field=None, max_length=None)

我刚刚将多余的代码删除了,如 post_picture = models.ImageField(upload_to='images/uploads/blog/%Y/%m/%d', height_field=None, default=None, width_field=None, max_length=None)所示,错误消失了

答案 6 :(得分:0)

首先使用主键集创建表结构,然后尝试上传 csv 文件后,我收到此错误。我的 CSV 文件在主键列中有信息。它是从另一个 sql server 导出的。无论我如何尝试导出和导入,它都不起作用。

我为解决这个问题所做的是将我的主键列放在我的数据库和我的 csv 中,上传,然后添加我的主键列。

答案 7 :(得分:-2)

尝试检查SQL数据库的限制。也许你超过了这一行的字段限制。

答案 8 :(得分:-2)

转到模型并检查,因为您可能截断了该特定列的多个单词,例如。 MAX_LENGTH = “150”。