MYSQL截断了不正确的DOUBLE值

时间:2010-08-11 07:37:58

标签: mysql

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

12 个答案:

答案 0 :(得分:179)

您不需要AND关键字。这是correct syntax of the UPDATE statement

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

答案 1 :(得分:64)

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

像我的查询一样

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

当我将where子句更改为where column2 in ('00012121');时,查询对我来说运行正常。

答案 2 :(得分:11)

尝试用AND

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

UPDATE Syntax显示逗号应该用作分隔符。

答案 3 :(得分: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;

答案 4 :(得分:4)

我只是浪费了我的时间,并希望添加一个此错误出现的其他案例。

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

我知道它没有回答这个问题,但这是谷歌针对此错误的第一个结果,它应该有其他示例,其中出现此错误。

答案 5 :(得分:2)

基本上是什么

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

从我的错误中学习

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

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!这是怎么发生的?
*内部尖叫*

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

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

更正后的查询如下:

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

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

*结束内部尖叫*

答案 6 :(得分:1)

<块引用>

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

答案 7 :(得分:0)

如果你的插件看起来像下面这个问题,那么问题可能只是--与评论文字之间缺少空格:

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

问题在于--something实际上应该-- something有空格。

答案 8 :(得分:0)

似乎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';

答案 9 :(得分:0)

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

答案 10 :(得分: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解决了该问题。

答案 11 :(得分:0)

这是因为使用更新查询时“和”介于两者之间

错误 ==> $match

而不是使用COMMA(,)

正确 ==> db.users.aggregate([ { $match: { $expr: { $and: [ { $gte: [ "$registerDate", { $toDate: "2021-02-28T21:00:00Z" } ] }, { $lt: [ "$registerDate", { $toDate: "2021-10-31T21:00:00Z" } ] } ] } } } ])