我有一个数据库,我们用每个名字的首字母存储用户名 - 即IsaacSparling。我正在尝试对我的MySQL(v5.1.46)db进行不区分大小写的自动完成。 Table有一个UTF8的字符集和一个utf8_unicode_ci的排序规则。我也针对utf8_general_ci整理完成了这些测试。
纯ASCII文本可以正常工作:
mysql> select username from users where username like 'j%';
+----------------+
| username |
+----------------+
| J******** |
| J*********** |
| J************* |
+----------------+
3 rows in set (0.00 sec)
mysql> select username from users where username like 'J%';
+----------------+
| username |
+----------------+
| J******** |
| J*********** |
| J************* |
+----------------+
3 rows in set (0.00 sec)
(名称已编辑,但他们在那里)。
但是,当我尝试对ASCII集之外的unicode字符执行相同操作时,没有这样的运气:
mysql> select username from users where username like 'ø%';
Empty set (0.00 sec)
mysql> select username from users where username like 'Ø%';
+-------------+
| username |
+-------------+
| Ø********* |
+-------------+
1 row in set (0.00 sec)
一些调查告诉我:http://bugs.mysql.com/bug.php?id=19567(tl; dr,这是unicode排序规则的已知错误,修复它是'新功能'优先级 - 即,不会完成在任何合理的时间范围内)。
有没有人发现任何有效的解决方法,允许对MySQL中的unicode字符进行不区分大小写的搜索?任何想法都赞赏!
答案 0 :(得分:1)
使用版本5.1.42-community
可以正常使用也许你的mysql客户端没有正确发送unicode字符。我使用sqlYog进行了测试,它与utf8_unicode_ci和utf8_general_ci collations都很好用
答案 1 :(得分:0)
如果您关心的是能够通过文本订购字段值而不关心它是大写还是小写我认为您可以做的最好的事情是在处理字段时而不是仅仅键入{{1} },键入username
,然后您可以完美地使用该字段的命令,通过名称
答案 2 :(得分:0)
您是否尝试过使用CONVERT?像
这样的东西WHERE `lastname` LIKE CONVERT( _utf8 'ø%' USING latin1 )
可能适合你。
答案 3 :(得分:0)
我刚使用查询解决了同样的问题
show variables like '%char%';
我的character_set_client设置为'utf8',但是character_set_connection和character_set_results设置为'latin1'。因此,函数UPPER,LOWER,LIKE没有按预期工作。
我刚刚插入了这行
mysql_query("SET NAMES utf8");
在连接后立即获得不区分大小写的搜索工作。