错误代码1292-截断了错误的DOUBLE值-MySQL


85

我不确定这是什么错误!

#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表

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

7
根据此错误报告,消息来自将字符串列与整数进行比较,因为它们都被转换为double进行比较。怎么样ac.company_codeta.company_code宣布?
Barmar

另请参见bugs.mysql.com/bug.php?id=46641,其中张贴者建议将此错误消息改写为“不允许在数值和非数值列之间进行比较”
Barmar

这些列都是int(11)而不是字符串!
Mike

您可以使用一些示例数据制作sqlfiddle吗?
Barmar

Answers:


156

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

如果关闭strict模式,则错误应变为警告。


1
哇,真是令人误解的错误消息。感谢您的帮助。你是对的。我需要更改DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);DB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
Ryan

4
谢谢你 扩展:可以通过多种方式来触发它。在我的情况下,它使用正则表达式从字符串中提取整数,并将其与整数进行比较。奇怪的是,当我只使用SELECT语句时,一切都很好:从t1上的t1内部联接t2中选择xxxx。id= substr(value,locate(':',tagvalue)+1)一旦将其转换为INSERT。 ..SELECT,错误已触发。
xgretsch '19

22

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

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

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


谢谢,这不是一个大问题,但有时小问题变成了大问题
Sumit Kumar Gupta

非常感谢!!!!这在更新声明的上下文中发生了
KC Baltz

8

我面临着同样的问题。试图将varchar(100)列与数字1进行比较。导致1292错误。通过在1('1')附近加上单引号来解决。

感谢您上面的解释


3

TL; 博士

这也可能是由于应用于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)

代替。


谢谢!我是MySQL的新手,我使用SQL Server允许的方式进行连接,例如string1 + string2 + string3。您对concat函数的建议为我修复了此错误。
Marcy

1

当我收到此错误时,我相信这是一个错误,但是请记住,如果使用SELECT语句和相同的WHERE子句进行单独的查询,则可以从SELECT:)SELECT CONCAT(primary_id, ',')语句中获取主ID并插入使用条件->“ WHERE [primary_id] IN([SELECT语句中逗号分隔的主ID列表”)将它们放入失败的UPDATE查询中,这可以减轻由原始(失败)查询的WHERE子句引起的任何问题。

对我个人而言,当我在“ WHERE ____ IN([此处的值])”中使用引号时,在300个预期条目中只有10个受到了影响,在我看来,这似乎是一个错误。


1

我已经看到过几次发生此错误的情况:

1.!=where带有多个or值的子句中使用not equals运算符

如:

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

这可以通过使用解决

where columnName not in ('A','B')

2.在if()函数中缺少比较运算符:

select if(col1,col1,col2);

为了选择中的值(col1如果存在),否则在中显示值col2。可以使用以下方法解决:

select if(col1!='',col1,col2);

0

在我的情况下,这是一个视图(高度嵌套,视图为视图)插入,导致

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

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


0

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

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

0

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

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

使用:

CHECK (CHAR_LENGTH(username)>=8)

代替

CHECK (username>=8)

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


0

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

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

# 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”,因为该服务不会重新启动。


在每个会话的基础上执行此操作比较安全,或者甚至仅在修改“麻烦的表”的特定脚本中更好:$pdo->query('SET SESSION SQL_MODE = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')并且在脚本魔术之后,以相同的方式严格执行以下操作:$pdo->query('SET SESSION SQL_MODE = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')
Piemol
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.