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.