2012-07-13 60 views
1

如何在比較時使用LOCATE忽略重音符號?例如:使用帶重音符號的位置

SELECT LOCATE('a', 'João'); -- Fail 
>> Currently: 0 
>> Need:  3 

SELECT LOCATE('ã', 'João'); -- Ok 
>> Currently: 3 
>> Need:  3 

我該怎麼做?我不能在這種情況下使用LIKE(並且它工作正常!)。

回答

1

如果您使用latin1字符集,某些重音符號將被忽略。但是,這可能會對某些輸入有意想不到的行爲,因此請務必徹底測試。

SET character_set_connection='latin1'; 
SELECT LOCATE('a', 'João'); 
+0

我可以使用COLLATE方法嗎? – 2012-07-13 23:07:53

+0

我不相信有一個UTF-8排序規則可以做你想做的事情。如果不轉換UTF-8數據,你不能使用latin1排序規則。 – 2012-07-14 00:44:44

+0

另請注意,您可能需要在運行此查詢後重置字符集,因爲它將在連接的生命週期中生效。 – 2012-07-14 00:45:34

3

一個好的解決方案是,(基於邁克爾Mior回答):

SELECT LOCATE('a', CONVERT('João' USING latin1)); 

標杆(邁克爾Mior法):

SET character_set_connection='latin1'; 
    SELECT LOCATE('a', 'João'); 
    >> 10.000.000 run at 0.532s 

標杆(電流法):

SELECT LOCATE('a', CONVERT('João' USING latin1));  
    >> 10.000.000 run at 1.906s 

Michael Mior版本是4次更快。