2013-12-20 45 views
1

我試圖防止mysql將字符串強制轉換爲where子句中的int。防止mysql將字符串轉換爲int在where子句中

下面的查詢返回正確的行爲訂單

SELECT delivery_name FROM orders WHERE orders_id = '985225'

,因爲它是鑄造我的字符串爲int下面的查詢也返回同一行,但我想,以防止它完全返回行(即,不會將給定的字符串轉換爲int,並且有效地說,這不能準確地轉換爲int,所以不要)。

SELECT delivery_name FROM orders WHERE orders_id = '985225a'

我希望是有道理的,任何幫助將不勝感激!

+4

在你讓它靠近查詢字符串之前,你應該在你的客戶端代碼中檢查非int的東西。 –

+0

我不認爲你可以說服MySQL做你想做的事情(和大多數其他DBMS一樣) –

回答

1

您應該能夠完全避免這種情況,但如果你想要一個解決辦法,你可以Concat的一個字符的字符串的前面,是這樣的:

SELECT delivery_name 
FROM orders 
WHERE CONCAT('a',orders_id) = CONCAT('a','985225a') 
+0

downvoted,即使這可以工作它生病沒有任何索引on order_id強制對整個訂單表進行全表掃描。 – jean

+0

@jean Upvoted,沒有人在這裏討論索引,而只是想知道OP想要什麼。來吧。 –

+0

@jean是的,應該避免這種情況,但是我提供了一個有效的解決方法。 –

0

我建議你考績該變量作爲來自您的應用程序的整數。

SELECT delivery_name FROM orders WHERE orders_id = '985225' 

如果orders_id是一個整數,這意味着在發動機訂單的每一行病隱它orders_id轉換爲字符串,以評估orders_id =「985225」 它不只是緩慢,但生病渲染沒用任何索引。

如果你所能做的只是編輯SQL,我建議你施放這個變量。

orders_id = CAST(「985225」 AS INT)

以及一個最終提示,在應用層其更容易做驗證輸入並防止用戶的非有效的整數輸入。

+0

感謝您的答案,但我相信,mysql實際上將我給'985225'的字符串轉換爲int 985225,而不是將表中的每個int轉換爲一個字符串。所以,是的,通過傳遞一個int而不是一個字符串會提高性能,但在大多數情況下它可以忽略不計,並且該索引仍然只是一個有用的,就像一個int被傳遞一樣。 –

0

第1步 - 從sql字符串中刪除單引號。換句話說,改變這種:

WHERE orders_id = '985225' 

這樣:

WHERE orders_id = 985225 

第2步 - 按照@Marc B的評論,確保你確實有一個整數。

第3步 - 使用查詢參數。就我所知,MySql接受它們。

+0

即使在帶有索引的大表中刪除orders_id中的引號也可以忽略不計的速度差異(並且實際上也會阻止'985225a'值被髮送)。在這種情況下,我不想確定在客戶端代碼中實際上有一個int ...這是問題的關鍵。我不確定查詢參數是什麼,解釋會有幫助。 –