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 2017年

ANDの前に「Secolul XVI-XVIII」のブール値を計算しようとしていると思います。
アントンコリエフ2018年

1
「where x = 'x' and y」の場合、これはよく考えられていない曖昧なエラーになります
Johan Snowgoose

回答:


214

ANDキーワードは必要ありません。次に、UPDATEステートメントの正しい構文を示します

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

12
コンピュータを壁に投げ込む前にこの答えを見つけて本当にうれしい
rbennell 2017

19
私のような人々が間違いを犯しているのは間違いなく愚かですが、「切り捨てられた誤ったDOUBLE値」はかなり役に立たない警告メッセージです...
rbennell

6
基本的に、構文の問題がある場合は常に、この役に立たない例外「mysql-truncated-incorrect-double-value」を
スローし

はい..iも、引用符を使用せずに 'where'句で文字列リテラルを使用しようとしたときに同様の経験をしました。
プラナイ

だから自殺しようとしていた。あなたが私の命を救った神に感謝します。これは愚かで、更新中です。😠🤣
gauravmehla

72

この例外は、コンマではなくANDのせいではなく、実際にはwhere句でアポストロフィを使用していなかったためにこの例外が発生していました。

私のクエリのように

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

where句をwhere column2 in ('00012121');次に変更する と、クエリは正常に機能しました。


2
私にとって同じ問題!管理ユーザーのユーザーIDとして1を使用し、他のすべてのユーザーには36文字のGUIDを使用するCRMのテーブルを更新しようとしました。私は、引用符なしでuser_idを1として指定していました。これはmysqlがstrictモードになっていることに関連していると思います。
dmulvi 2013

3
@danny_mulvihill私はあなたが正しい軌道に乗っていると信じています。私がいたSTRICT_TRANS_TABLESに設定sql_modeし、で数値を(ように見えるもの)に制限され、フィールド更新しようとwhere、エラー投げた句を。モードを変更すると、代わりに警告が表示されましたが、それでも更新は適用されませんでした。よく調べてみると、整数値のように見えるものしかなかったにもかかわらず、where句で使用された列は実際にはvarchar(20)
Robert Gannon

私にとって同じ問題。'select * from t where id = 6503'は問題なく動作しましたが、 'update t set a = "foo" where id = 6503'はエラー1292(22007):誤ったDOUBLE値: '234805557438#'を切り捨てました。idは整数のように見えますが、varcharでした。アップデートで値を引用することで問題は解決しました。'update t set a = "foo" where id = "6503"'
gaoithe

mysqlコンソールでは機能していたが、Pentaho Data Integrationソフトウェアでは機能しなかったINSERTを渡したときの同じ問題。「name> 1000 and name <6000」を「name> '1000' and name <'6000'」に変更し、チャームのように動作しました。
Sawd

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、値0が立っているテーブル設定のvarchar列を更新しました。私の更新クエリは次のようでした:

UPDATE myTable SET myValue = NULL WHERE myValue = 0;

さて、実際のタイプはmyValueis 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!

これが単なる警告ではないので、これらの引用を忘れることはそれほど危険ではありません。

*内部の叫びを止める*


1
あなたは警告で失敗するオプションを設定することができます-見stackoverflow.com/a/4289242/1488762
ロジャー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'」で失敗する

フィールドはintではなくvarchar型であるため、クエリを実行するには、shop_id 26244317283を引用符 '26244317283'で囲む必要があります。

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

サブエラーが誤って異なる型である2つの列に一致するWHERE EXISTを実行しようとしたときに、このエラーが発生しました。2つのテーブルも異なるストレージエンジンでした。

1つの列はCHAR(90)で、もう1つの列はBIGINT(20)でした。

1つのテーブルはInnoDBで、もう1つはMEMORYでした。

クエリの一部:

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

1つの列の列タイプをBIGINTからCHARに変更すると、問題が解決しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.