Hata Kodu 1292 - Kesilmiş yanlış DOUBLE değeri - Mysql


87

Bu hatanın ne olduğundan emin değilim!

#1292 - Truncated incorrect DOUBLE value: 

Çift değer alanına veya veriye sahip değilim!

Bunu anlamaya çalışırken bir saatimi harcadım!

işte benim sorgum

INSERT INTO call_managment_system.contact_numbers 
    (account_id, contact_number, contact_extension, main_number, created_by)
SELECT
    ac.account_id,
    REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') AS Phone,
    IFNULL(ta.ext, '') AS extention,
    '1' AS MainNumber,
    '2' AS created_by
FROM 
    cvsnumbers AS ta
    INNER JOIN accounts AS ac ON ac.company_code = ta.company_code
WHERE 
    LENGTH(REPLACE(REPLACE(REPLACE(REPLACE(ta.phone_number, '-', ''), ' ', ''), ')', ''),'(','') ) = 10

işte şovum sonuçların gireceği tablo için tablo oluştur

CREATE TABLE `contact_numbers` (  
    `number_id` int(10) unsigned NOT NULL AUTO_INCREMENT,  
    `account_id` int(10) unsigned NOT NULL DEFAULT '0',  
    `person_id` int(11) NOT NULL DEFAULT '0',  
    `contact_number` char(15) NOT NULL,  
    `contact_extension` char(10) NOT NULL DEFAULT '',  
    `contact_type` enum('Primary','Direct','Cell','Fax','Home','Reception','Office','TollFree') NOT NULL DEFAULT 'Primary',  
    `contact_link` enum('Account','PDM','Other') NOT NULL DEFAULT 'Account',  
    `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '0 = inactive, 1=active', 
    `main_number` tinyint(1) NOT NULL DEFAULT '0' COMMENT '1 = main phone number',  
    `created_on` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,  
    `created_by` int(11) NOT NULL,  
    `modified_on` datetime DEFAULT NULL,  
    `modified_by` int(11) NOT NULL DEFAULT '0',  
    PRIMARY KEY (`number_id`),  
    KEY `account_id` (`account_id`),  
    KEY `person_id` (`person_id`)
) ENGINE=InnoDB AUTO_INCREMENT=534 DEFAULT CHARSET=utf8

8
Göre bu hata raporu mesajı ikisi de olsun dönüştürülen çünkü bir tamsayı olan bir dize sütunu karşılaştırarak gelir doublekarşılaştırma için. Nasıl yapılır ac.company_codeve ta.company_codeilan edilir?
Barmar

Ayrıca bugs.mysql.com/bug.php?id=46641 adresinde bir posterin bu hata mesajının "sayısal ve sayısal olmayan sütunlar arasındaki karşılaştırmalara NEREDE izin verilmediği" şeklinde yeniden
yazılmasını önerdiği bölüme bakın

Bu sütunların her ikisi de dizeler değil, int (11) 'dir!
Mike

Bazı örnek verilerle bir sqlfiddle yapabilir misiniz?
Barmar

Yanıtlar:


159

Bu mesaj, bir WHEREveya ONtümcecikteki bir sayı ve bir dizeyi karşılaştırmaya çalıştığınız anlamına gelir . Sorgunuzda, bunun meydana gelebileceği tek potansiyel yer ON ac.company_code = ta.company_code; ya benzer bildirimlere sahip olduklarından emin olun ya CASTda sayıyı bir dizeye dönüştürmek için bir açık kullanın.

strictModu kapatırsanız , hata bir uyarıya dönüşmelidir.


1
Vay canına, ne yanıltıcı bir hata mesajı. Yardım için teşekkürler. Haklıydın. Değiştirmem DB::table('contacts')->where('attendance', $int) ->update(["attendance" => $string]);gerekiyorduDB::table('contacts')->where('attendance', '' . $int) ->update(["attendance" => $string]);
Ryan

4
Bunun için teşekkürler. Genişletmek için: Bunun tetiklenebileceği pek çok yol vardır. Benim durumumda, bir dizeden bir tamsayı çıkarmak için bir regexp kullanıyordu ve bunu bir tamsayı ile karşılaştırıyordu. Garip bir şekilde, SELECT deyimini kullandığımda her şey yolunda gitti: t1.id = substr (değer, locate (':', tagvalue) +1) üzerinde t1 internal join t2'den xxxx'i seçin. Bunu bir INSERT'e çevirdim. ..SELECT, hata tetiklendi.
xgretsch

22

Sorguda bir sözdizimi hatası veya bazı istenmeyen karakterler olduğu için bu hatayı düzelttim, ancak MySQL bunu yakalayamadı. andGüncelleme sırasında birden çok alan arasında kullanıyordum , örn.

update user 
set token='lamblala', 
    accessverion='dummy' and 
    key='somekey' 
where user = 'myself'

Yukarıdaki sorgudaki sorun andvirgül ( ,) ile değiştirilerek çözülebilir.


Teşekkürler, bu büyük bir sorun değil ama bazen küçük bir sorun büyük bir sorun haline geliyor
Sumit Kumar Gupta

Çok teşekkür ederim!!!! Bu, bir güncelleme bildirimi bağlamında başıma geldi
KC Baltz

8

Ben de aynı sorunla karşı karşıyaydım. Bir varchar (100) sütununu sayısal 1 ile karşılaştırmaya çalışılıyor. 1292 hatasıyla sonuçlandı. 1 ('1') etrafına tek tırnak ekleyerek düzeltildi.

Yukarıdaki açıklama için teşekkürler


3

TL; DR

Bu aynı zamanda ORdize sütunlarına / değişmez değerlere uygulanmasından da kaynaklanabilir .

Tam versiyon

INSERTBir görünümü içeren basit bir ifade için aynı hata mesajını aldım :

insert into t1 select * from v1

tüm kaynak ve hedef sütunlar türde olmasına rağmen VARCHAR. Bazı hata ayıklamalardan sonra temel nedeni buldum; görünüm bu parçayı içeriyordu:

string_col1 OR '_' OR string_col2 OR '_' OR string_col3

Muhtemelen aşağıdaki kod parçacığının Oracle'dan otomatik olarak dönüştürülmesinin sonucuydu:

string_col1 || '_' || string_col2 || '_' || string_col3

( ||Oracle'da dize birleştirme). Çözüm kullanmaktı

concat(string_col1, '_', string_col2, '_', string_col3)

yerine.


Teşekkür ederim! MySQL'de yeni olan, string1 + string2 + string3 gibi SQL Server izin verilen yolu kullanarak birleştiriyordum. Concat işlevi öneriniz bu hatayı benim için düzeltti.
Marcy

1

Bu hatayı aldığımda bunun bir hata olduğuna inanıyorum, ancak bir SELECT ifadesi ve aynı WHERE cümlesiyle ayrı bir sorgu yaparsanız, o SELECT :) ifadesinden birincil kimlikleri SELECT CONCAT(primary_id, ',')alıp ekleyebileceğinizi unutmayın. bunları, koşullara sahip başarısız UPDATE sorgusuna -> "WHERE [birincil_kimlik] IN ([SELECT deyiminden virgülle ayrılmış birincil kimliklerin listesi)", orijinal (başarısız) sorgunun WHERE yan tümcesinin neden olduğu sorunları hafifletmenize olanak tanır.

Şahsen benim için, "NEREDE ____ IN ([değerler burada])" içindeki değerler için alıntı kullanırken, beklenen 300 girişten sadece 10'u etkilendi ki bu bana göre bir hata gibi görünüyor.


1

Bu hatanın meydana geldiği birkaç durum gördüm:

1. kullanmayan operatörü eşittir !=bir de whereçoklu bir listesini maddesi ordeğerler

gibi:

where columnName !=('A'||'B')

Bu, kullanılarak çözülebilir

where columnName not in ('A','B')

2. bir if()işlevde bir karşılaştırma operatörünün eksik olması :

select if(col1,col1,col2);

col1eğer varsa içindeki değeri seçmek ve aksi takdirde içindeki değeri göstermek için col2... bu hatayı atar; şu şekilde çözülebilir:

select if(col1!='',col1,col2);

0

Benim durumumda, hataya neden olan bir görünüm (yüksek oranda iç içe geçmiş, görünümde görünüm) eklemesiydi. :

CREATE TABLE tablename AS
  SELECT * FROM highly_nested_viewname
;

Yaptığımız geçici çözüm, somutlaştırılmış bir görünümü simüle etmekti (bu gerçekten bir tablodur) ve depolanan prosedürleri kullanarak periyodik olarak ekleme / güncelleme.


0

Geçmeye çalışırken ES6 ve TypeORM ile bu sorunu yaşadım .where("order.id IN (:orders)", { orders }), burada ordersvirgülle ayrılmış bir sayı dizisi vardı. Bir şablon değişmezine dönüştürdüğümde sorun çözüldü.

.where(`order.id IN (${orders})`);

0

Dize alanı uzunluğu için tabloda KONSTRAINT KONTROLÜ kullandıysanız

örneğin: kullanıcı adı uzunluğunu kontrol etmek için> = 8

kullanım:

CHECK (CHAR_LENGTH(username)>=8)

onun yerine

CHECK (username>=8)

yanlış veri türü karşılaştırması varsa kontrol kısıtlamasını düzeltin


0

Çift değerli alan veya veriniz yoksa, belki sql katı modunu devre dışı bırakmayı denemelisiniz.

Bunu yapmak için MySQL kurulum klasöründe bulunan " my.ini " dosyasını düzenlemeniz , "SQL modunu katı olarak ayarla" satırını bulmanız ve aşağıdaki satırı değiştirmeniz gerekir:

# Set the SQL mode to strict
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

buna, "STRICT_TRANS_TABLES" siliniyor

# Set the SQL mode to strict
sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

Bundan sonra, bu değişikliği etkinleştirmek için MySQL hizmetini yeniden başlatmanız gerekir .

Değişikliği kontrol etmek için editörü açın ve bu sql cümlesini yürütün:

SHOW VARIABLES LIKE 'sql_mode';

Çok Önemli : Kaydettikten sonra dosya formatına dikkat edin. Bunu "UTF8" olarak kaydedin ve "BOM ile TFT8" olarak kaydetmeyin çünkü hizmet yeniden başlamayacaktır.


Bu oturumun bazında başına bunu yapmak için daha güvenli, hatta daha iyi sadece belirli komut 'zahmetli tablolar' modifiye ediyor o: $pdo->query('SET SESSION SQL_MODE = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')ve komut sihirli sonra, aynı şekilde sıkı sırtını dönme:$pdo->query('SET SESSION SQL_MODE = "STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"')
Piemol
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.