MYSQL Memotong nilai DOUBLE salah


155

Ketika kueri SQL di bawah ini dijalankan:

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

Kesalahan berikut muncul:

1292 - Truncated incorrect DOUBLE value: 'Secolul XVI - XVIII'

Bagaimana cara memperbaikinya?


shop_category struktur meja:

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

1
Apakah dengan cara apa pun dapat ditentukan apa arti sebenarnya dari pesan kesalahan ini, dan dalam kasus mana pesan itu muncul? Karena terjadi dalam konteks di mana nilai DOUBLE tidak terlibat, tampaknya agak menyesatkan.
syck

Kira itu mencoba menghitung nilai BOOLEAN dari 'Secolul XVI - XVIII' sebelum AND.
Anton Kolyaev

1
Jika Anda memiliki "di mana x = 'x' dan y" Anda akan mendapatkan kesalahan yang kurang dipahami dan tidak jelas ini
Johan Snowgoose

Jawaban:


214

Anda tidak perlu ANDkata kunci. Berikut sintaks yang benar dari pernyataan UPDATE :

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

12
Sangat senang saya menemukan jawaban ini sebelum melemparkan komputer ke dinding
rbennell

19
jadi pasti kebodohan orang seperti saya yang membuat kesalahan itu, namun, 'Nilai GANDA terpotong salah' adalah pesan peringatan yang tidak berguna ...
rbennell

6
Pada dasarnya setiap kali ada beberapa masalah Sintaks, ia melempar pengecualian tidak berguna ini "mysql-terpotong-salah-nilai ganda"
heman123

Ya..saya juga punya pengalaman serupa ketika mencoba menggunakan string literal di klausa 'where' tanpa menggunakan tanda kutip.
pranay

Saya akan bunuh diri karena ini. Terima kasih Tuhan, kau menyelamatkan hidupku. Ini bodoh DAN dalam pembaruan. 😠🤣
gauravmehla

72

Saya mendapatkan pengecualian ini bukan karena DAN bukannya koma, sebenarnya saya memiliki pengecualian ini hanya karena saya tidak menggunakan tanda kutip di mana klausa.

Seperti kueri saya tadi

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

ketika saya mengubah tempat klausa untuk where column2 in ('00012121');kemudian permintaan berfungsi dengan baik untuk saya.


2
Masalah yang sama untuk saya! Saya mencoba memperbarui tabel dalam CRM yang menggunakan 1 sebagai id pengguna admin pengguna dan 36 char charids untuk semua pengguna lain. Di mana saya menentukan user_id sebagai 1, tanpa tanda kutip. Saya pikir ini terkait dengan mysql berada dalam mode ketat.
dmulvi

3
@danny_mulvihill Saya yakin Anda berada di jalur yang benar. Saya telah STRICT_TRANS_TABLESmenetapkan sql_modedan mencoba memperbarui bidang terbatas dengan (yang tampaknya) nilai numerik dalam whereklausa melempar kesalahan. Mengubah mode, itu melemparkan peringatan, tetapi masih tidak menerapkan pembaruan. Setelah diperiksa lebih dekat, kolom yang digunakan dalam klausa di mana, meskipun hanya memiliki apa yang tampak sebagai nilai integer, sebenarnya adalahvarchar(20)
Robert Gannon

Masalah yang sama bagi saya. A 'pilih * dari t di mana id = 6503' bekerja dengan baik tetapi 'perbarui t set a = "foo" di mana id = 6503' menghasilkan ERROR 1292 (22007): Tidak terpotong Nilai GANDA: '234805557438 #'. id terlihat seperti integer tetapi adalah varchar. Mengutip nilai dalam pembaruan memecahkan masalah. 'perbarui t set = "foo" di mana id = "6503"'
gaoithe

Masalah yang sama bagi saya ketika melewati INSERT yang berfungsi di konsol mysql tetapi tidak berfungsi di perangkat lunak Pentaho Data Integration. Mengubah "nama> 1000 dan nama <6000" menjadi "nama> '1000' dan nama <'6000'" dan bekerja seperti pesona.
Sawd

13

Coba ganti ANDdengan,

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

The UPDATE Sintaks menunjukkan tanda koma harus digunakan sebagai pemisah.


1
Bekerja untuk saya +1 untuknya :)
Faisal

12

Apa itu pada dasarnya

Ini sintaks yang salah yang menyebabkan MySQL berpikir Anda mencoba melakukan sesuatu dengan kolom atau parameter yang memiliki tipe "DOUBLE" yang salah.

Belajarlah dari kesalahan saya

Dalam kasus saya, saya memperbarui kolom varchar dalam pengaturan tabel NULLtempat nilainya 0berada. Permintaan pembaruan saya seperti ini:

UPDATE myTable SET myValue = NULL WHERE myValue = 0;

Sekarang, karena tipe aktualnya myValueadalah VARCHAR(255)ini memberikan peringatan:

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

Dan sekarang myTablepraktis kosong, karena myValuesekarang NULLuntuk SETIAP BARIS dalam tabel! Bagaimana ini bisa terjadi?
* Menjerit internal *

Lebih dari 30rb baris sekarang memiliki data yang hilang.
* Menjerit internal meningkat *

Syukurlah untuk backup. Saya dapat memulihkan semua data.
* Intensitas menjerit internal lebih rendah *

Kueri yang diperbaiki adalah sebagai berikut:

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

Saya berharap ini lebih dari sekedar peringatan sehingga tidak terlalu berbahaya untuk melupakan kutipan itu.

* Akhiri menjerit internal *


1
Anda dapat mengatur opsi untuk gagal pada peringatan - lihat stackoverflow.com/a/4289242/1488762
Roger Dueck

5

Saya hanya membuang-buang waktu untuk hal ini dan ingin menambahkan kasus tambahan di mana kesalahan ini muncul dengan sendirinya.

SQL Error (1292): Truncated incorrect DOUBLE value: 'N0003'

Uji data

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

Masalahnya adalah ORDER BY value1+0- tipe casting.

Saya tahu bahwa itu tidak menjawab pertanyaan tetapi ini adalah hasil pertama di Google untuk kesalahan ini dan seharusnya memiliki contoh lain di mana kesalahan ini muncul dengan sendirinya.


4

Terutama string kueri yang tidak valid akan memberikan peringatan ini.

Salah karena kesalahan sintaksis halus (tanda kurung kanan salah tempat) saat menggunakan INSTRfungsi:

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

Benar:

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

2

Tampaknya mysql menangani tipe casting dengan anggun dengan pernyataan SELECT. Bidang shop_id adalah tipe varchar tetapi pernyataan pilih berfungsi

select * from shops where shop_id = 26244317283;

Tetapi ketika Anda mencoba memperbarui bidang

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

Gagal dengan kesalahan Nilai terpotong salah GANDA: '1t5hxq9'

Anda harus memasukkan shop_id 26244317283 dalam tanda kutip '26244317283' agar permintaan bisa berfungsi karena bidangnya bertipe varchar bukan int

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

0

Jika Anda mendapatkan masalah ini dengan sisipan yang terlihat seperti di bawah ini, masalahnya mungkin adalah kurangnya ruang di antaranya -- dan teks komentar:

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

Masalah dengan ini adalah bahwa --somethingseharusnya benar-benar -- somethingdengan ruang.


0

Saya mengalami kesalahan ini ketika menggunakan bindParam, dan menentukan PDO :: PARAM_INT di mana saya benar-benar melewati sebuah string. Mengubah ke PDO :: PARAM_STR memperbaiki kesalahan.


0

Saya memang mengalami kesalahan ini ketika saya mencoba melakukan WHERE EXIST di mana subquery cocok dengan 2 kolom yang secara tidak sengaja adalah tipe yang berbeda. Kedua meja itu juga merupakan mesin penyimpanan yang berbeda.

Satu kolom adalah CHAR (90) dan yang lainnya adalah BIGINT (20).

Satu meja adalah InnoDB dan yang lainnya adalah MEMORY.

Bagian dari permintaan:

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

Mengubah jenis kolom pada satu kolom dari BIGINT ke CHAR menyelesaikan masalah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.