我有一個腳本可以根據兩個給定參數生成SQL查詢:字段和值。最後,它產生類似於:Mysql隱式類型轉換會生成錯誤的結果
SELECT * FROM table WHERE <field> IN <value>;
到目前爲止,沒有什麼嚴重的。但現在想象一下:你有一個字段的字段,有時只包含數字,有時不包含數字。現在你給的123值:
SELECT string FROM table WHERE string = 123;
由於MySQL的Autocasting,這個查詢將導致任何一行無論是在它或啓動與123串123。有什麼辦法可以禁用部分字符串的這種自動投射嗎?我只想獲得包含正是給定值結果(投或不)
簡單測試SQL 這個小選擇說明了什麼問題:
SELECT '123abc' IN (123, 234, 'xyz');
注:由於我的SQL是腳本生成,我不能簡單地將我的值轉換爲字符串或將其包含在上引號中。理想的解決方案是隻操作操作員返回等於,無論是哪種類型。
使用MySQL強制轉換功能。 SELECT'123abc'= cast(123 as char); – broadband
這可能不是一個選項,因爲我的真實查詢(第一個示例)使用IN,生成的查詢也可能引用實際爲INT類型的列。在這種情況下,我的演員陣容可能會對關鍵使用產生不良影響? – ToBe
使用IN(a,b,c,...)與column = a或者column = b或...相同... MySQL在執行前優化/重寫此查詢。如果您有該列的索引,它也取決於課程。關鍵用途的壞影響是,如果你使用像這樣:列'like關鍵字'(不使用索引)。像這樣使用:像'keyword%'這樣的列(確實使用索引)請參閱第10頁http://www.percona.com/files/presentations/WEBINAR-full-text-search-throwdown.pdf – broadband