我的表格网站
Website_Name//column name
Google
Facebook
Twitter
Orkut
Frype
Skype
Yahoo
Wikipedia
我使用utf8_bin collation然后我的查询在网站中搜索维基百科是
Select Website_Name from Website where lower(Website_Name)='wikipedia'
如果我使用utf8_unicode_ci,那么我在网站搜索维基百科的选择查询
Select Website_Name from Website where Website_Name='wikipedia'
现在我想知道哪种排序规则最佳,具体取决于以下查询
答案 0 :(得分:57)
这取决于你需要什么。
utf8_bin
归类完全基于Unicode code point值来比较字符串。如果所有代码点具有相同的值,则字符串相等。但是,如果您使用不同组合的字符串来组合标记(组合与分解)或规范等效但不具有相同代码点值的字符,则会出现这种情况。在某些情况下,使用utf8_bin
会导致字符串在您预期时不匹配。从理论上讲,utf8_bin
是最快的,因为没有对字符串应用Unicode规范化,但它可能不是您想要的。
utf8_general_ci
使用特定于语言的规则应用Unicode规范化,并且不区分大小写地比较字符串。 utf8_general_cs
执行相同的操作,但会区分大小写的字符串。
答案 1 :(得分:11)
我个人会选择utf8_unicode_ci
,如果您希望信箱对您想要找到的结果一般不重要。
排序不仅在运行时使用,而且在MySQL构建索引时使用。因此,如果这些列中的任何列出现在索引中,则根据该排序规则的比较规则查找数据的速度将与以前一样快。
在您不希望不区分大小写匹配的情况下,请不要应用大写或小写。相反,在utf8列前面应用BINARY
关键字来强制进行文字代码点比较,而不是根据排序规则进行比较。
mysql> create table utf8 (name varchar(24) charset utf8 collate utf8_general_ci, primary key (name));
Query OK, 0 rows affected (0.14 sec)
mysql> insert into utf8 values ('Roland');
Query OK, 1 row affected (0.00 sec)
mysql> insert into utf8 values ('roland');
ERROR 1062 (23000): Duplicate entry 'roland' for key 'PRIMARY'
mysql> select * from utf8 where name = 'roland';
+--------+
| name |
+--------+
| Roland |
+--------+
1 row in set (0.00 sec)
mysql> select * from utf8 where binary name = 'roland';
Empty set (0.01 sec)
这应该比使用lower或upper快得多,因为在这些情况下,MySQL首先需要复制列值并修改其lettercase,然后应用比较。有了BINARY,它将首先使用索引来查找匹配,然后通过代码点比较执行代码点,直到找到值不相等,这通常会更快。
答案 2 :(得分:8)
我使用的是'utf8_unicode_ci',默认为doctrine,我不得不将其更改为:
* @ORM\Table(name = "Table", options={"collate"="utf8_bin"})
由于我的一些复合主键由文本字段组成。可悲的是,'utf8_unicode_ci'将“poistný”和“poistny”解析为相同的主键值,并以插入flush的doctrine结束崩溃。我不能简单地更改复合主键的一部分的排序规则,不得不删除表并重新创建。希望它为别人节省时间..