MYSQL截断了不正确的DOUBLE值

Ema*_*uel 139 mysql

执行以下SQL查询时:

UPDATE shop_category 
SET name = 'Secolul XVI - XVIII' 
    AND name_eng = '16th to 18th centuries' 
WHERE category_id = 4768
Run Code Online (Sandbox Code Playgroud)

引发以下错误:

1292 - Truncated incorrect DOUBLE value: 'Secolul XVI - XVIII'
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?


shop_category 表结构:

category_id   mediumint(8)
name        varchar(250)
name_eng      varchar(250)
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 194

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

UPDATE 
    shop_category 
SET 
    name = 'Secolul XVI - XVIII', 
    name_eng = '16th to 18th centuries' 
WHERE 
    category_id = 4768
Run Code Online (Sandbox Code Playgroud)

  • 所以,像我这样犯错误的人肯定是愚蠢的,然而,'截断不正确的DOUBLE值'是一个相当无用的警告信息...... (13认同)
  • 真的很高兴我把这台电脑扔到墙上之前找到了这个答案 (6认同)
  • 基本上每当出现一些语法问题时,就会抛出这个无用的异常"mysql-truncated-incorrect-double-value" (4认同)
  • 因为这个我差点要自杀了。感谢上帝你救了我的命。这个愚蠢的并且正在更新。 (2认同)

小智 68

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

就像我的查询一样

update table set coulmn1='something' where column2 in (00012121);
Run Code Online (Sandbox Code Playgroud)

当我改变where子句时 where column2 in ('00012121');,查询对我来说很好.

  • @danny_mulvihill我相信你走在正确的轨道上.我在`sql_mode`中设置了`STRICT_TRANS_TABLES`,并尝试更新一个限制为(where似乎是)`where`子句中的数值的字段引发错误.更改模式,它会发出警告,但仍然没有应用更新.经过仔细检查,where子句中使用的列,尽管只有看起来是整数值,实际上是`varchar(20)` (3认同)
  • 同样的问题对我来说!我正在尝试更新crm中的表,该表使用1作为admin用户的用户ID,使用36个char guids供所有其他用户使用.我在哪里指定user_id为1,没有引号.我认为这与mysql处于严格模式有关. (2认同)

cod*_*ict 12

尝试替换AND使用,

UPDATE shop_category 
SET name = 'Secolul XVI - XVIII', name_eng = '16th to 18th centuries' 
WHERE category_id = 4768
Run Code Online (Sandbox Code Playgroud)

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


Ada*_*ass 7

看来 mysql 使用 SELECT 语句优雅地处理类型转换。shop_id 字段的类型为 varchar,但 select 语句有效

select * from shops where shop_id = 26244317283;
Run Code Online (Sandbox Code Playgroud)

但是当你尝试更新字段时

update stores set store_url = 'https://test-url.com' where shop_id = 26244317283;
Run Code Online (Sandbox Code Playgroud)

它失败并出现错误截断不正确的双值:'1t5hxq9'

您需要将 shop_id 26244317283 放在引号“26244317283”中才能使查询正常工作,因为该字段的类型为 varchar 而不是 int

update stores set store_url = 'https://test-url.com' where shop_id = '26244317283';
Run Code Online (Sandbox Code Playgroud)


Adr*_*oia 6

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

使用INSTR函数时由于细微的语法错误(右括号错位)而错误:

INSERT INTO users (user_name) SELECT name FROM site_users WHERE
INSTR(status, 'active'>0);
Run Code Online (Sandbox Code Playgroud)

正确的:

INSERT INTO users (user_name) SELECT name FROM site_users WHERE
INSTR(status, 'active')>0;
Run Code Online (Sandbox Code Playgroud)


hal*_*.am 6

基本上是什么

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

从我的错误中学习

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

UPDATE myTable SET myValue = NULL WHERE myValue = 0;
Run Code Online (Sandbox Code Playgroud)

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

+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1292 | Truncated incorrect DOUBLE value: 'value xyz' |
+---------+------+-----------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

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

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

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

更正后的查询如下:

UPDATE myTable SET myValue = NULL WHERE myValue = '0';
                                                  ^^^
                                                  Quotation here!
Run Code Online (Sandbox Code Playgroud)

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

*结束内部尖叫*

  • 您可以设置一个选项以在警告时失败 - 请参阅/sf/answers/300246971/ (2认同)

hrv*_*j3e 5

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

SQL Error (1292): Truncated incorrect DOUBLE value: 'N0003'
Run Code Online (Sandbox Code Playgroud)

测试数据

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
Run Code Online (Sandbox Code Playgroud)

问题是ORDER BY value1+0-类型转换。

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


小智 5

这是因为使用更新查询时中间有“and”

错误==>"update user_detail set name = ? and phone_code = ? and phone_num = ? and email = ? where emp_code = ?";

而不是使用COMMA(,)

==>"update user_detail set name = ?, phone_code = ?, phone_number = ?, email = ? where emp_code = ?"