MYSQL截断了错误的DOUBLE值


155

执行以下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)

1
可以通过任何方式确定此错误消息的真正含义是什么,在什么情况下会显示出来?由于它发生在不涉及DOUBLE值的上下文中,因此似乎有些误导。
锡克(Syck)

猜猜它试图计算AND之前的'Secolul XVI-XVIII'的BOOLEAN值。
安东·科里亚耶夫

1
如果你有“其中x =‘x’和y”,你会得到这个差的构思和令人费解的错误
约翰Snowgoose

Answers:


214

您不需要AND关键字。这是UPDATE语句正确语法

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

12
非常高兴我在将计算机扔到墙上之前找到了这个答案
rbennell

19
所以像我这样的
人犯的

6
基本上,只要有语法问题,它就会抛出这个无用的异常“ mysql-truncated-incorrect-double-value”
heman123 '18

是的..i在尝试在'where'子句中使用字符串文字而不使用引号的时候也有类似的经历。
pranay

因此我正要自杀。感谢上帝,您救了我的命。这个愚蠢的和更新中的。😠🤣
gauravmehla

72

我得到这个异常不是因为AND而不是逗号,实际上是因为我没有在where子句中使用撇号。

就像我的查询是

update table set coulmn1='something' where column2 in (00012121);

当我将where子句更改为时, where column2 in ('00012121');查询对我来说很好用。


2
对我来说同样的问题!我正在尝试更新crm中的表,该表使用1作为admin用户的用户ID,对所有其他用户使用36个字符的GUID。我在哪里将user_id指定为1,不带引号。我认为这与mysql处于严格模式有关。
dmulvi

3
@danny_mulvihill我相信您的方向正确。我已经STRICT_TRANS_TABLES设置好了,sql_mode并试图更新一个where子句中的数值受(似乎是)数值限制的字段,这引发了错误。更改模式时,它发出警告,但仍未应用更新。经过仔细检查,where子句中使用的列尽管仅具有看似整数,但实际上是varchar(20)
Robert Gannon 2014年

对我来说也是一样。'从id = 6503的t中选择*'可以正常工作,但是'update t在id = 6503的条件下设置a =“ foo”导致错误1292(22007):截断了不正确的DOUBLE值:'234805557438#。id看起来像整数,但是是varchar。引用更新中的值可以解决问题。'update t set a =“ foo”其中id =“ 6503”'
gaoithe

当我传递在mysql控制台中工作但在Pentaho Data Integration软件中不工作的INSERT时,对我来说也是同样的问题。将“名称> 1000和名称<6000”更改为“名称>'1000'和名称<'6000'”,并像一个超级按钮一样工作。
Sawd '16

13

请尝试更换AND,

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

UPDATE语法显示逗号应作为分隔符。


1
为我+1了:)
Faisal

12

基本上是什么

这是错误的语法,导致MySQL认为您正在尝试对类型为“ DOUBLE”的列或参数进行操作。

从我的错误中学习

就我而言,我NULL在值所在的表设置中更新了varchar列0。我的更新查询是这样的:

UPDATE myTable SET myValue = NULL WHERE myValue = 0;

现在,由于实际的类型myValueVARCHAR(255)这个给人的警告:

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

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

现在,超过3万行的数据缺失。
*内部尖叫声加剧*

谢天谢地的备份。我能够恢复所有数据。
*内部尖叫强度降低*

更正后的查询如下:

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

我希望这不仅仅是警告,所以忘记这些引文的危险性较小。

*结束内部尖叫*


1
您可以设置一个在警告时失败的选项-请参阅stackoverflow.com/a/4289242/1488762
Roger Dueck

5

我只是在此上浪费时间,想添加一个额外的案例来说明此错误。

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-类型转换。

我知道它不能回答问题,但这是Google在此错误上的第一个结果,应该有其他示例可以说明此错误。


4

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

使用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;

2

看来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;

它失败,并显示以下错误:截断了错误的DOUBLE值:'1t5hxq9'

您需要将shop_id 26244317283放在引号'26244317283'中,以使查询正常工作,因为该字段的类型为varchar not int

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

0

如果您遇到的问题看起来像下面这样的插入物,则问题可能仅在于--注释文本之间缺少空格:

insert into myTable (a, b, c)
values (
   123 --something
  ,345 --something else
  ,567 --something something else
);

问题在于,--something实际应该-- something有一个空格。


0

使用bindParam并在我实际传递字符串的位置指定PDO :: PARAM_INT时遇到了此错误。更改为PDO :: PARAM_STR可修复该错误。


0

当我尝试执行WHERE EXIST时,子查询匹配了偶然是不同类型的2列,我确实遇到了此错误。这两个表也是不同的存储引擎。

一栏为CHAR(90),另一栏为BIGINT(20)。

一个表是InnoDB,另一个表是MEMORY。

查询部分:

[...] AND EXISTS (select objectid from temp_objectids where temp_objectids.objectid = items_raw.objectid );

将一列的列类型从BIGINT更改为CHAR解决了此问题。

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.