utf8_bin与utf_unicode_ci

34 mysql database collation relation

我的表网站

Website_Name//column name
Google
Facebook
Twitter
Orkut
Frype
Skype
Yahoo
Wikipedia
Run Code Online (Sandbox Code Playgroud)

我使用utf8_bin collat​​ion然后我的查询在网站搜索维基百科是

Select Website_Name from Website where lower(Website_Name)='wikipedia'
Run Code Online (Sandbox Code Playgroud)

如果我使用utf8_unicode_ci然后我的选择查询在网站搜索维基百科是

Select Website_Name from Website where Website_Name='wikipedia'
Run Code Online (Sandbox Code Playgroud)

现在我想知道哪种排序规则最好,具体取决于以下查询

Del*_*ani 62

这取决于你需要什么.

utf8_bin整理比较了它们的Unicode纯粹基于字符串的代码点值.如果所有代码点具有相同的值,则字符串相等.但是,如果您使用不同组合的字符串来组合标记(组合与分解)或规范等效但不具有相同代码点值的字符,则会出现这种情况.在某些情况下,使用utf8_bin会导致字符串在您期望它们时不匹配.从理论上讲,utf8_bin它是最快的,因为没有对字符串应用Unicode规范化,但它可能不是你想要的.

utf8_general_ci使用特定于语言的规则应用Unicode规范化,并且不区分大小写地比较字符串.utf8_general_cs做同样的事情,但比较字符串区分大小写.

  • 虽然在英语中是相同的,但使用`lower()`并不总是与在某些语言中不区分大小写的情况相同,并且您可能会遇到问题,使用`lower()`来比较不区分大小写.我坚持使用不区分大小写的排序规则. (2认同)
  • 这个问题问的是`utf8_unicode_ci`,不是一般问题。 (2认同)

Rol*_*man 13

我个人认为utf8_unicode_ci,如果你希望信箱对你想要找到的结果一般不重要的话.

排序不仅在运行时使用,而且在MySQL构建索引时使用.因此,如果这些列中的任何列出现在索引中,则根据该排序规则的比较规则查找数据的速度将与以前一样快.

在那些您不需要不区分大小写匹配的情况下,请不要应用大写或小写.相反,BINARY在utf8列前面应用关键字以强制进行文字代码点比较,而不是根据排序规则进行比较.

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)
Run Code Online (Sandbox Code Playgroud)

这应该比使用lower或upper快得多,因为在这些情况下,MySQL首先需要复制列值并修改其字母大小,然后应用比较.在BINARY到位的情况下,它将首先简单地使用索引来查找匹配,然后通过代码点比较执行代码点,直到它发现值不相等,这通常会更快.

  • 从我的经历中脱颖而出; 当行为`utf8_general_ci`时,使用`WHERE BINARY`或`COLLATE utf8_bin`会对使用PRIMARY KEY的查询产生负面的性能影响.在MySQL 5.6.22和5.6.10上测试过.问题直到数据库处于正常负载之前才出现. (3认同)

Jir*_*son 8

我使用的是'utf8_unicode_ci',默认为doctrine,我必须将其更改为:

 * @ORM\Table(name = "Table", options={"collate"="utf8_bin"})
Run Code Online (Sandbox Code Playgroud)

由于我的一些复合主键由文本字段组成.可悲的是,'utf8_unicode_ci'将"poistný"和"poistny"解析为相同的主键值,并以插入flush的doctrine结束崩溃.我不能简单地更改复合主键的一部分的排序规则,不得不删除表并重新创建.希望它为别人节省时间..