MYSQL Kesilmiş hatalı DOUBLE değeri


155

Aşağıdaki SQL sorgusu yürütüldüğünde:

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

Aşağıdaki hata ortaya çıktı:

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

Bunu nasıl düzeltirim?


shop_category masa yapısı:

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

1
Herhangi bir şekilde bu hata mesajının gerçek anlamının ne olduğunu ve hangi durumlarda ortaya çıktığını belirleyebilir mi? ÇİFT değerin dahil olmadığı bağlamlarda oluştuğu için, biraz yanıltıcı görünüyor.
syck

Ve önce 'Secolul XVI - XVIII' BOOLEAN değerini hesaplamaya çalışır sanırım.
Anton Kolyaev

1
"Burada x = 'x' ve y" varsa, bu kötü tasarlanmış ve belirsiz hata alırsınız
Johan Snowgoose

Yanıtlar:


214

ANDAnahtar kelimeye ihtiyacınız yok . İşte UPDATE ifadesinin doğru sözdizimi :

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

12
Gerçekten bir cevap bilgisayarı bir duvara atmadan önce bu cevabı buldum
rbennell

19
benim gibi insanların bu hatayı yapması kesinlikle aptallık, ancak, 'Kesilmiş yanlış ÇİFT değeri' oldukça işe yaramaz bir uyarı mesajı ...
rbennell

6
Temelde ne zaman bir sözdizimi sorunu varsa bu işe yaramaz istisna atar "mysql kesilmiş-yanlış-çift-değer"
heman123

Evet ... ben de 'nerede' yan tümcesinde bir tırnak kullanarak dize değişmezi kullanmaya çalışırken benzer bir deneyim yaşadım.
pranay

Bu yüzden intihar etmek üzereydim. Çok şükür hayatımı kurtardın. Bu aptal VE güncelleme. 😠🤣
gauravmehla

72

Bu istisnayı virgül yerine AND yerine almıyordum, aslında bu istisnayı sadece yan tümcede kesme işareti kullanmamaya başladım.

Sorgum gibiydi

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

nerede cümle değiştirdiğimde where column2 in ('00012121');sorgu benim için iyi çalıştı.


2
Benim için de aynı sorun! Yönetici kullanıcı kullanıcı kimliği 1 ve diğer tüm kullanıcılar için 36 char kılavuzları kullanan bir crm bir tablo güncellemeye çalışıyordu. Konumum tırnak işareti olmadan user_id değerini 1 olarak belirtiyordu. Bu mysql sıkı modda olması ile ilgili olduğunu düşünüyorum.
dmulvi

3
@danny_mulvihill Doğru yolda olduğunuzu düşünüyorum. sahiptimSTRICT_TRANS_TABLES ayarlanır sql_modeve sayısal bir değer (gibi görünen) ile sınırlı bir alan güncellemeye çalışırken wherebir hata attı maddesi. Modları değiştirmek, bunun yerine bir uyarı attı, ancak yine de güncellemeyi uygulamadı. Daha yakından incelendiğinde, yalnızca tamsayı değerler gibi görünen şeylere rağmen, nerede maddesinde kullanılan sütun aslında birvarchar(20)
Robert Gannon

Benim için de aynı sorun var. İd = 6503'ün işe yaradığı 't *' dan * seçildi ancak 'güncelleme t a = "foo" ayarladı, burada id = 6503' ERROR 1292 (22007) ile sonuçlandı: Kesilmiş hatalı DOUBLE değeri: '234805557438 #'. id tamsayı gibi görünüyor ama bir varchar oldu. Güncellemedeki değerin belirtilmesi sorunu çözdü. 'güncelleme t a = "foo" ayarladı, burada id = "6503"
33'te gaoit

MySQL konsolunda çalışan, ancak Pentaho Data Integration yazılımında çalışmayan bir INSERT'i geçerken benim için aynı sorun. "Name> 1000 ve <6000" adını "name> '1000" ve <<6000 "olarak değiştirdi ve cazibe gibi çalıştı.
Sawd

13

Değiştirmeyi deneyin ANDile,

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

UPDATE Kullanımı gösterileri virgül ayırıcı olarak kullanılmalıdır.


1
Benim için çalıştı + 1 :)
Faisal

12

Temel olarak ne

MySQL'in yanlış türde "DOUBLE" türüne sahip bir sütun veya parametre ile bir şeyler yapmaya çalıştığınızı düşünmesine neden olan yanlış sözdizimi.

Benim hatamdan öğren

Benim durumumda NULLdeğerin bulunduğu bir tablo ayarındaki varchar sütununu güncelledim 0. Güncelleme sorgum şuydu:

UPDATE myTable SET myValue = NULL WHERE myValue = 0;

Şimdi, asıl türü olduğu myValueiçin VARCHAR(255)bu uyarı verir:

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

Ve şimdi myTablepratik olarak boş, çünkü myValueşimdi NULLtablodaki HER SATIR için! Bu nasıl oldu?
* iç çığlıklar *

30 binden fazla satırda eksik veriler var.
* iç çığlıklar yoğunlaşıyor *

Yedekler için çok şükür. Tüm verileri kurtarabildim.
* dahili çığlık yoğunluğu düşer *

Düzeltilmiş sorgu aşağıdaki gibidir:

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

Keşke bu bir uyarıdan daha fazlası olsaydı bu yüzden bu alıntıları unutmak daha az tehlikelidir.

* Dahili çığlığı sonlandırın *


1
Uyarılarda başarısız olma seçeneğini belirleyebilirsiniz - bkz. Stackoverflow.com/a/4289242/1488762
Roger Dueck

5

Bu konuda zamanımı harcadım ve bu hatanın kendini gösterdiği ek bir durum eklemek istedim.

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

Test verisi

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

Sorun ORDER BY value1+0tipi dökümdür.

Soruyu cevaplamadığını biliyorum, ancak bu Google için bu hata için ilk sonuç ve bu hatanın kendini gösterdiği başka örnekler olmalı.


4

Genellikle geçersiz sorgu dizeleri bu uyarıyı verecektir.

INSTRİşlev kullanılırken ince bir sözdizimi hatası (yanlış yerleştirilmiş sağ parantez) nedeniyle yanlış :

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

Doğru:

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

2

Görünüşe göre mysql, SELECT ifadeleriyle döküm türünü incelikle işliyor. Shop_id alanı varchar türündedir ancak select deyimleri çalışır

select * from shops where shop_id = 26244317283;

Ancak alanları güncellemeye çalıştığınızda

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

Hata ile başarısız Kesildi yanlış DOUBLE değeri: '1t5hxq9'

Alanın int türünde değil varchar türünde olduğundan, sorgunun çalışması için shop_id 26244317283 tırnaklarına '26244317283' yazmanız gerekir

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

0

Bu sorunu aşağıdaki gibi görünen bir ekle alıyorsanız, sorun sadece boşluk --ile yorum metni arasında bir boşluk olmayabilir :

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

Buradaki sorun, --somethingaslında -- somethingbir boşluk ile olması gerektiğidir .


0

Ben bindParam kullanırken ve aslında bir dize geçiyordu PDO :: PARAM_INT belirlerken bu hatayla karşılaştım. PDO :: PARAM_STR olarak değiştirmek hatayı düzeltti.


0

Alt sorgunun yanlışlıkla farklı türlerden olan 2 sütunla eşleştiği bir NEREDE YAPILMAYA çalıştığımda bu hatayla karşılaştım. İki tablo da farklı depolama motorlarıydı.

Bir sütun bir CHAR (90) ve diğeri bir BIGINT (20) idi.

Bir tablo InnoDB, diğeri MEMORY idi.

Sorgunun bir parçası:

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

Bir sütundaki sütun türünün BIGINT'ten CHAR'a değiştirilmesi sorunu çözdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.