2013-11-04 53 views
1

我有一個腳本可以根據兩個給定參數生成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是腳本生成,我不能簡單地將我的值轉換爲字符串或將其包含在上引號中。理想的解決方案是隻操作操作員返回等於,無論是哪種類型。

+0

使用MySQL強制轉換功能。 SELECT'123abc'= cast(123 as char); – broadband

+0

這可能不是一個選項,因爲我的真實查詢(第一個示例)使用IN,生成的查詢也可能引用實際爲INT類型的列。在這種情況下,我的演員陣容可能會對關鍵使用產生不良影響? – ToBe

+0

使用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

回答

0

如果您希望將它們用作字符串,請引用您的參數。 檢查它是如何工作的:

SELECT '123abc' = '123' 

如果使用自動發生器構建查詢時自動加引號的 - 選擇,而不是在看似價值做出的決定之一,根據列類型支持的數據庫模式定義和報價/施放價值,類型,如你的例子。

+0

我已經在使用一些一種汽車發電機。這個決定了給定值的類型,然後適當地施放,而不是考慮目標列,因爲它可能是任何發生器不知道的暫時的列。所以在我的情況下,123有資格作爲一個數字,並將採取不引號,我無能爲力。 – ToBe