2009-11-06 52 views
1

開始串的數字我有這個表:選擇匹配整數

CREATE TABLE `test` (
    `ID` int(11) NOT NULL auto_increment, 
    `text` varchar(250) collate utf8_unicode_ci default NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

內容:

 
ID  text 
1  70-and-some-text 
70  blub 

然後,我讓執行這個查詢:

SELECT 
    * 
FROM 
    test 
WHERE 
    ID = '70-and-some-text' 
OR 
    text = '70-and-some-text' 

,並得到兩條線結果是。看起來MySQL試圖根據ID匹配許多數字,然後停止。我想我在某個地方看過,但找不到它了。

答覆和提示是非常感謝。提前致謝。善良,我是新人。告訴我,如果我做錯了什麼。我對你們有很多的尊重。

斯特芬

==================

感謝託默勒格,我現在才知道問題出在哪裏得來的。任何處理這個問題的最佳實踐?我控制'文本',所以我可以使用'_70-and-some-text'或字符串。但MySQL中的解決方案將是「最純粹的」。

回答

6

此行

ID = '70-and-some-text' 

使得MySQL的右手側的操作數轉換爲INT,由於列的類型爲INT的。轉換顯然會導致數字70.您可以將任何數據類型以字符串的形式傳遞到MySQL查詢中,MySQL將透明地進行必要的類型轉換,就像在這種情況下一樣。

2

目前我不能指出,如果這種行爲在MySQL文檔中的任何地方都有描述,但它歸結爲以下內容。

MySQL試圖將發送到數字列(例如int,decimal)的任何數據解釋爲數字,無論這樣做是否合理。即使一個日期可以被解釋爲數字,或者如果MySQL無法確定傳遞給它的任何有用數據,只需存儲0.

INSERT INTO yourtable (intcolumn) VALUES (NOW()); //2009 
INSERT INTO yourtable (intcolumn) VALUES ('aa'); //0 
INSERT INTO yourtable (intcolumn) VALUES (12.12); //12 
INSERT INTO yourtable (intcolumn) VALUES (12.8); //13 (!) 
..... 

我想這種行爲可以通過使用正確的MySQL Server Mode

+0

你能指出服務器模式,我應該試着打開的? – 2009-11-06 11:21:25

+0

我已經想知道爲什麼你編輯我的答案,而不是你自己的答案。 ;-) – Tomalak 2009-11-06 15:05:45