2009-06-15 67 views
1

我有以下問題(使用mysql 5.0.70)。MySQL查詢與類似%..%在where子句返回不同的結果

在一個表我有一個包含某種一些,喜歡的varchar字段:

"0303A342", "21534463", "35663CE3" 

等整理設置爲utf8_general_ci

當系統的用戶試圖搜索包含這個數字的一​​部分的記錄時,問題就出現了。 SQL查詢看起來像

... 
WHERE 'number' LIKE '%0303A%' 

現在,如果在LIKE部分「A」輸入爲Latin A,結果只包含Latin A的記錄他們 - 因爲它應該。而當A爲Cyrillic時,結果僅爲那些包含CyrillicA的行。還有許多其他字母,如E,C,B,T等等。

現在我的問題是,如果有一種方法來修改我的sql查詢,所以它返回的所有行匹配LIKE '%0303A%'部分,但在那裏的所有類型的A`s?或者我應該在插入/更新數據庫之前轉換用戶輸入?

回答

1

應該轉換用戶輸入,沒有功能LOOKS LIKEMySQL :)

可以音譯字符串存儲與原來在一起,並用php::translit做到這一點:

 
id data trans_data 
1 Москва MOSKVA 
2 София SOFIA 
SELECT * 
FROM table 
WHERE trans_data LIKE CONCAT('%', ?, '%') 

mysqli->bind_param('s', strtoupper(transliterate('Москва'))); 
+0

是的,「看起來像」正是我正在尋找:) – mmartinov 2009-06-15 13:43:15

0

某些字母在幾個字母中看起來相似的事實並不使它們相同。事實上,它們看起來相似甚至可能取決於用來顯示它們的字體。

您的示例數據看起來像十六進制值。在不瞭解問題背景的情況下,是否可以讓用戶以十進制格式輸入數據(僅使用數字)?另一種可能性可能是自定義控件輸入搜索條件。它是否必須是自由文本或可能有幾個選項的列表框就足夠了?

如果不是,您可能會發現與您所使用的語言或庫中的Quassnoi描述(transliterate())類似的函數。用普通的MySQL你可能不太好運。即使你找到了一些你想要的功能,確保它支持你的用戶將要使用的所有語言/字母 - 我不知道有多少字母有1:1的字符映射到拉丁人。

+0

數據只是包含數字,字母,甚至可能是一些破折號的字符串。沒有什麼像十六進制值或其他結構.. – mmartinov 2009-06-15 13:41:26

0

我不能使用php translit - 我正在處理的數據(我稱之爲'數字')是某種標識符,因此搜索「IA」是沒有意義的,如果有人輸入「Я」。 因爲我知道我的用戶將只使用拉丁文和西里爾文字符,所以我要做的是製作兩個字母表中的常用字母列表,並在到達數據庫之前轉換用戶輸入。很糟糕,但似乎是最合適的解決方案。