2012-07-13 84 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次更快。

相关问题