Kategoriler
Teknik

MySQL’de “Truncated incorrect DOUBLE value” hatası

Her ne kadar hata içerisinde "DOUBLE value" ibaresi geçse de bu hatayı aldığınızda tablonuzda DOUBLE tipinde bir sütun mevcut olmayabilir. Bu yüzden bir kafa karışıklığı yaratabiliyor. Benim karşılaştığım, VARCHAR türünde bir sütunda INTEGER koşul sorgulama yaptığım sırada hata vermesiydi. Örnek sorguyu paylaşayım:

 update `foo_table` set `foo_type` = 'PC', `foo_table`.`updated_at` = '2022-07-23 12:32:41' where `id` >= 4843051 and `user
_id` = 8081 and `foo_id` = 12 and `foo_type` = 'CT';

Bu sorgudaki problem, foo_id sütunundaki koşulu belirtirken integer olarak koşullandırmamdan kaynaklı. Halbuki bu sütun string türünde veri de tutabilecek türde yani VARCHAR. Bu sebepten dolayı "Truncated incorrect DOUBLE value" hatası aldım. Bunu düzeltmek için foo_id koşulundaki veriyi tırnak içine aldım.

 update `foo_table` set `foo_type` = 'PC', `foo_table`.`updated_at` = '2022-07-23 12:32:41' where `id` >= 4843051 and `user
_id` = 8081 and `foo_id` = '12' and `foo_type` = 'CT';

Ve artık her şey yolunda.

Araştırdığım kadarıyla daha çok UPDATE sorgularında yaşanan bir problem ve MySQL açısından haklı bir serzeniş.

Bu hata ile karşılaşmanıza olası başka bir senaryoda şu şekildeymiş:

update students SET name='Ali' and score=9 where id=1
ERROR 1292 (22007): Truncated incorrect DOUBLE value: 'Ali'

Bu sorgudaki sıkıntı açık, UPDATE yaparken name ve score sütunlarını belirtirken AND ifadesi kullanmak. Normal şartlarda UPDATE sorgusunda güncelleme yapılacak sütunlar tanımlanırken virgül ile ayırılır. Yani:

update students SET name='Ali', score=9 where id=1

Diğer bir çözüm olarak da CAST() fonksiyonu kullanılabilir.

Ek olarak PDO veya Laravel üzerinde Eloquent ORM ile veriyi bind ederken string olarak göndermelisiniz.

Student::where('foo_id', '15')->update([...]);
Student::where('foo_id', '19RDA32')->update([...]);

PDO ile:

$statement = $pdo->prepare('update ...');
$statement->bindParam('foo_id', '15');
// veya
$statement->bindParam('foo_id', '15', \PDO::PARAM_STR);

PDO‘da, bindParam metodunda üçüncü parametre varsayılan olarak \PDO::PARAM_STR olarak tanımlıdır. Bu detayda hatanıza sebep olabilecek durumlardan birisi olabilir.

İyi çalışmalar.