找到mysql函数不能很好地与unicodes?

时间:2014-02-11 12:56:17

标签: mysql sql

我有以下查询

SELECT * 
FROM  `keywords` 
WHERE name LIKE  '%ba%'
ORDER BY LOCATE(  'ba', name ) , name
LIMIT 0 , 30

此查询应按侧面keywords.name中“ba”的显示对结果进行排序。但是,我在一些特殊的字符上得到一些奇怪的行为:如果 - 例如 - 我有Ghurabā这个词的查询 像%ba%会找到它。但是,似乎locate(Ghurabā,ba)将返回0 - 意味着在字符串中找不到模式

任何想法如何克服这个问题?

p.s - 一些有用的数据:

上述查询的结果:

  

Ghurabā'

     

Khuṭabā'

     

qabā\

     

里巴特

     

ba'urchi(厨师)

     

巴格达   ...

请注意,它适用于“常规英文字符”,但是喜欢和定位功能之间存在不匹配

使用Collcation:utf8_general_ci(与utf_unicode_ci得到相同的结果) mysql:受影响的版本mysql 5.5 / 5.6(可能更低)

修改

上面查询的预期结果应该是这样的 “

  

巴格达

     

ba'urchi(厨师)

     

qabā\

     

里巴特

     

Ghurabā'

     

Khuṭabā'

注意:按照ab距离单词开头的顺序排序,然后按名称排序

...

1 个答案:

答案 0 :(得分:1)

您应该使用BINARY运算符来比较字符串。检查这些查询 -

SELECT
  name,
  name LIKE BINARY '%ba%',
  name LIKE '%ba%',
  LOCATE('ba', name)
FROM
  `keywords`;

来自文档:

  • LOCATE - 此函数是多字节安全的
  • LIKE - 基于每个字符执行匹配