MYSQL截断不正确的DOUBLE值。

193

当执行下面的 SQL 查询时:

UPDATE shop_category 
SET name = 'Secolul XVI - XVIII' 
    AND name_eng = '16th to 18th centuries' 
WHERE category_id = 4768
以下错误被引发:
1292 - Truncated incorrect DOUBLE value: 'Secolul XVI - XVIII'

如何修复这个问题?


shop_category 表结构:

category_id   mediumint(8)
name        varchar(250)
name_eng      varchar(250)

2
这个错误消息的真正含义和在哪些情况下会出现有没有办法确定呢?由于它出现在不涉及DOUBLE值的上下文中,因此似乎有点误导。 - syck
1
在AND之前,它试图计算“Secolul XVI - XVIII”的BOOLEAN值。 - Anton Kolyaev
2
如果你有 "where x = 'x' and y",你会得到这个不好理解和晦涩的错误。 - Johan Snowgoose
14个回答

273
你不需要使用 AND 关键字。这是 UPDATE 语句的正确语法
UPDATE 
    shop_category 
SET 
    name = 'Secolul XVI - XVIII', 
    name_eng = '16th to 18th centuries' 
WHERE 
    category_id = 4768

26
很高兴在把电脑扔到墙上之前找到了这个答案。 - rbennell
36
当然,像我这样犯错误就绝对是愚蠢的,不过,“截断不正确的DOUBLE值”是一条相当无用的警告信息…… - rbennell
12
基本上,每当出现某些语法问题时,它都会抛出这个无用的异常“mysql-truncated-incorrect-double-value”。 - heman123
1
是的,我也有类似的经历,当我在'where'子句中尝试使用字符串字面量而没有使用引号时。 - pranay
3
我差点因为这个而自杀。谢天谢地你救了我的命。这个愚蠢的AND在更新中。 - gauravmehla
显示剩余2条评论

89
我遇到了这个异常,不是因为使用了AND而应该使用逗号,实际上是因为我在where子句中没有使用撇号。就像我的查询语句一样。
update table set coulmn1='something' where column2 in (00012121);

当我将where子句更改为 where column2 in ('00012121');,那么查询对我来说就正常工作了。


2
我也遇到了同样的问题!我试图更新一个使用1作为管理员用户ID和36个字符GUID用于所有其他用户的CRM中的表。我的where子句将user_id指定为1,没有加引号。我认为这与mysql处于严格模式有关。 - dmulvi
3
@danny_mulvihill 我相信你走在正确的道路上。我在sql_mode中设置了STRICT_TRANS_TABLES,并尝试更新一个在where子句中限制为(看起来)数字值的字段时,会抛出错误。更改模式后,它只会抛出警告,但仍未应用更新。经过仔细检查,在where子句中使用的列,尽管只有看似整数值,实际上是一个varchar(20) - Robert Gannon
我也遇到了同样的问题。'select * from t where id = 6503' 可以正常工作,但 'update t set a = "foo" where id = 6503' 导致 ERROR 1292 (22007):截断错误的 DOUBLE 值:'234805557438#'。id看起来像是整数,但实际上是 varchar。在更新中引用该值可以解决问题。'update t set a = "foo" where id = "6503"'。 - gaoithe
我也遇到了同样的问题,当我在mysql控制台中运行INSERT命令时,它可以正常工作,但在Pentaho数据集成软件中却无法正常工作。将“name > 1000 and name < 6000”更改为“name > '1000' and name < '6000'”,问题迎刃而解。 - Sawd

32

基本含义

这是不正确的语法,导致MySQL认为您正在尝试使用具有不正确类型“DOUBLE”的列或参数进行操作。

从我的错误中学习

在我的情况下,我更新了一个表中的varchar列,将值为0的位置设置为NULL。我的更新查询如下:

UPDATE myTable SET myValue = NULL WHERE myValue = 0;

现在,由于myValue的实际类型是VARCHAR(255),因此会出现以下警告:

+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'value xyz' |
+---------+------+-----------------------------------------------+

现在myTable几乎为空,因为表中每一行的myValue都变成了NULL!这是怎么发生的?
*内心尖叫*

现在有超过30k行数据丢失。
*内心尖叫加强*

多亏备份,我能够恢复所有数据。
*内心尖叫强度降低*

修正后的查询如下:

UPDATE myTable SET myValue = NULL WHERE myValue = '0';
                                                  ^^^
                                                  Quotation here!

我希望这不仅是一种警告,这样就不那么危险忘记那些引号。

*内心的尖叫声结束*


2
您可以设置一个选项,在警告时失败 - 请参见 https://dev59.com/MG855IYBdhLWcg3wiU31#4289242 - Roger Dueck
1
它是否包括内部尖叫时的失败? - Eoin

16
尝试将AND替换为,
UPDATE shop_category 
SET name = 'Secolul XVI - XVIII', name_eng = '16th to 18th centuries' 
WHERE category_id = 4768

UPDATE Syntax 的语法规则表明应该使用逗号作为分隔符。


8
我刚刚在这上面浪费了时间,想要补充一种情况,即此错误出现的情况。
SQL Error (1292): Truncated incorrect DOUBLE value: 'N0003'

测试数据

CREATE TABLE `table1 ` (
    `value1` VARCHAR(50) NOT NULL 
);
INSERT INTO table1 (value1) VALUES ('N0003');

CREATE TABLE `table2 ` (
    `value2` VARCHAR(50) NOT NULL 
);

INSERT INTO table2 (value2)
SELECT value1
FROM table1
WHERE 1
ORDER BY value1+0

问题是ORDER BY value1+0 - 类型转换。
我知道这并没有回答问题,但这是谷歌上第一个出现这个错误的结果,应该还有其他例子会出现这个错误。

7

看起来 MySQL 在 SELECT 语句中对类型转换处理得很好。shop_id 字段的类型为 varchar,但 SELECT 语句可以正常工作。

select * from shops where shop_id = 26244317283;

但是当您尝试更新这些字段时,请注意:
update stores set store_url = 'https://test-url.com' where shop_id = 26244317283;

出现错误:“Truncated incorrect DOUBLE value: '1t5hxq9'”

由于该字段是varchar类型而非int类型,您需要使用引号将shop_id 26244317283放在单引号中'26244317283'才能使查询正常工作。

update stores set store_url = 'https://test-url.com' where shop_id = '26244317283';

6

主要是无效的查询字符串会引发此警告。

在使用INSTR函数时,由于微妙的语法错误(括号放错位置)而出现错误:

INSERT INTO users (user_name) SELECT name FROM site_users WHERE
INSTR(status, 'active'>0);

正确:

INSERT INTO users (user_name) SELECT name FROM site_users WHERE
INSTR(status, 'active')>0;

我曾经遇到过一个有趣的情况,与此类似。有人在插入语句中使用了 "select Field + Field2" 而不是 "select concat(Field,Field2)"。 - AnthonyJ

5
这是因为在使用更新查询时,"and"之间的符号造成的。 错误写法 ==> "update user_detail set name = ? and phone_code = ? and phone_num = ? and email = ? where emp_code = ?"; 应该使用逗号(,)正确写法 ==> "update user_detail set name = ?, phone_code = ?, phone_number = ?, email = ? where emp_code = ?"

4

1292 - 被截断的错误DOUBLE值:

当您尝试在SQL中比较不同类型时,例如在以下查询中使用`uniqueid`=1610386969.1713,就会发生此错误:

UPDATE `cdr` SET `userfield`='survey=5,' WHERE `uniqueid` = 1610386969.1713

更改它以在此UPDATE示例中传递错误:

UPDATE `cdr` SET `userfield`='survey=5,' WHERE `uniqueid` = '1610386969.1713'

但在你的问题中,如果将AND更改为,,问题就会解决。

UPDATE shop_category SET name = 'Secolul XVI - XVIII', name_eng = '16th to 18th centuries' WHERE category_id = 4768

0
// CALL `ut_liquid_name_maildt`() Edit
// Truncated incorrect DOUBLE value: 'IPPAGUNTA VIJAYALAKSHMI'

// Code Sample

BEGIN

 -- Declare loop constructs --
    DECLARE done INT DEFAULT FALSE; 
    DECLARE my_id VARCHAR(50);
    DECLARE my_name VARCHAR(50);
    DECLARE my_mail_dt date;
    DECLARE my_name_gl VARCHAR(50);
    DECLARE my_mail_dt_gl VARCHAR(50);
  

-- cursor --
declare cr cursor for select t2.id,t1.name,t1.mail_dt,t2.name as name_gl,t2.mail_dt as mail_dt_gl
from sch_acc_saleint as t1
inner join
sch_acc_salegl  as t2 
where t1.sch_batch = t2.sch_batch;

 -- Declare Continue Handler --
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cr;

    read_loop: LOOP

        -- Fetch data from cursor --
        FETCH cr 
        INTO my_id,my_name,my_mail_dt,my_name_gl,my_mail_dt_gl;

       -- Exit loop if finished --
        IF done THEN
            LEAVE read_loop;
        END IF;
        -- Update Query --
        UPDATE sch_acc_salegl SET name = my_name and mail_dt = my_mail_dt  WHERE id = my_id;


    END LOOP read_loop;

CLOSE cr;

END

// I was using wrong update query that"s why it is showing error [ Truncated incorrect DOUBLE value ]
// For this type of error check update query
// For example :

UPDATE sch_acc_salegl SET name = my_name,mail_dt = my_mail_dt  WHERE id = my_id;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接