错误代码1292 - 截断不正确的DOUBLE值 - Mysql

时间:2013-04-17 19:52:57

标签: mysql truncated mysql-error-1292

我不确定这个错误是什么!

#1292 - Truncated incorrect DOUBLE value: 

我没有双值字段或数据!

我浪费了整整一个小时试图解决这个问题!

这是我的查询

INSERT INTO call_managment_system.contact_numbers 
    (account_id, contact_number, contact_extension, main_number, created_by)
SELECT
    ac.account_id,
    REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') AS Phone,
    IFNULL(ta.ext, '') AS extention,
    '1' AS MainNumber,
    '2' AS created_by
FROM 
    cvsnumbers AS ta
    INNER JOIN accounts AS ac ON ac.company_code = ta.company_code
WHERE 
    LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') ) = 10

这是表格的show create table,结果将进入

CREATE TABLE `contact_numbers` (  
    `number_id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
    `account_id` int(10) unsigned NOT NULL DEFAULT '0',  
    `person_id` int(11) NOT NULL DEFAULT '0',  
    `contact_number` char(15) NOT NULL,  
    `contact_extension` char(10) NOT NULL DEFAULT '',  
    `contact_type` enum('Primary','Direct','Cell','Fax','Home','Reception','Office','TollFree') NOT NULL DEFAULT 'Primary',  
    `contact_link` enum('Account','PDM','Other') NOT NULL DEFAULT 'Account',  
    `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 = inactive, 1=active', 
    `main_number` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 = main phone number',  
    `created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  
    `created_by` int(11) NOT NULL,  
    `modified_on` datetime DEFAULT NULL,  
    `modified_by` int(11) NOT NULL DEFAULT '0',  
    PRIMARY KEY (`number_id`),  
    KEY `account_id` (`account_id`),  
    KEY `person_id` (`person_id`)
) ENGINE=InnoDB AUTO_INCREMENT=534 DEFAULT CHARSET=utf8

10 个答案:

答案 0 :(得分:95)

此消息表示您正在尝试比较WHEREON子句中的数字和字符串。在您的查询中,唯一可能发生的地方是ON ac.company_code = ta.company_code;要么确保它们有类似的声明,要么使用显式CAST将数字转换为字符串。

如果您关闭strict模式,错误应该会变成警告。

答案 1 :(得分:5)

我遇到了同样的问题。尝试将varchar(100)列与数字1进行比较。导致1292错误。通过在1(' 1')附近添加单引号来修复。

感谢上面的解释

答案 2 :(得分:4)

我更正了此错误,因为查询中存在语法错误或某些不需要的字符,但MySQL无法捕获它。我在更新期间在多个字段之间使用and,例如

update user 
set token='lamblala', 
    accessverion='dummy' and 
    key='somekey' 
where user = 'myself'

上述查询中的问题可以通过用逗号(and)替换,来解决

答案 3 :(得分:2)

<强> TL; DR

这也可能是因为OR应用于字符串列/文字。

完整版

对于涉及视图的简单INSERT语句,我收到了相同的错误消息:

insert into t1 select * from v1

虽然所有源列和目标列都是VARCHAR类型。经过一些调试,我找到了根本原因;该视图包含此片段:

string_col1 OR '_' OR string_col2 OR '_' OR string_col3

这可能是从Oracle自动转换以下代码段的结果:

string_col1 || '_' || string_col2 || '_' || string_col3

||是Oracle中的字符串连接)。解决方案是使用

concat(string_col1, '_', string_col2, '_', string_col3)

代替。

答案 4 :(得分:1)

When I received this error I believe it was a bug, however you should keep in mind that if you do a separate query with a SELECT statement and the same WHERE clause, then you can grab the primary ID's from that SELECT: SELECT CONCAT(primary_id, ',')) statement and insert them into the failed UPDATE query with conditions -> "WHERE [primary_id] IN ([list of comma-separated primary ID's from the SELECT statement)" which allows you to alleviate any issues being caused by the original (failed) query's WHERE clause.

For me, personally, when I was using quotes for the values in the "WHERE ____ IN ([values here])", only 10 of the 300 expected entries were being affected which, in my opinion, seems like a bug.

答案 5 :(得分:0)

在我的情况下,这是一个视图(高度嵌套,视图内)插入导致中的错误:

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

我们最终要做的解决方法是模拟实例化视图(实际上是一个表),并使用存储过程定期插入/更新它。

答案 6 :(得分:0)

在尝试传递.where("order.id IN (:orders)", { orders })时,ES6和TypeORM出现了此问题,其中orders是逗号分隔的数字字符串。当我转换为模板文字时,问题已解决。

.where(`order.id IN (${orders})`);

答案 7 :(得分:0)

此错误可能是由于在!=子句中使用不等于运算符where导致的,该子句包含多个or值的列表,例如

where columnName !=('A'||'B')

这可以通过使用

解决。
where columnName not in ('A','B')

答案 8 :(得分:0)

如果您已在表上使用 CHECK CONSTRAINT 检查字符串字段的长度

例如:检查用户名长度> = 8

使用:

CHECK (CHAR_LENGTH(username)>=8)

代替

CHECK (username>=8)

如果数据类型比较错误,则修复检查约束

答案 9 :(得分:0)

如果您没有双精度值字段或数据,也许您应该尝试禁用sql严格模式。

为此,您必须编辑MySQL安装文件夹中的“ my.ini ”文件,找到“将SQL模式设置为严格”行并更改以下行:

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

为此,删除“ STRICT_TRANS_TABLES”

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

此后,您必须重新启动MySQL服务以启用此更改。

要检查更改,请打开编辑器并执行以下sql语句:

SHOW VARIABLES LIKE 'sql_mode';

非常重要:保存后请注意文件格式。将其另存为“ UTF8”,而不要另存为“带有BOM的TFT8”,因为该服务将不会重新启动。