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)
Emanuel
sumber
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
Darin Dimitrov
sumber
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.

Sidra
sumber
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.

codaddict
sumber
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 *

halfpastfour.am
sumber
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.

hrvoj3e
sumber
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;
Adrian Goia
sumber
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';
Adam Winnipass
sumber
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.

Joe Phillips
sumber
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.

Bytech
sumber
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.

pencuri
sumber