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 collation然后我的查询在网站搜索维基百科是
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
做同样的事情,但比较字符串区分大小写.
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_unicode_ci',默认为doctrine,我必须将其更改为:
* @ORM\Table(name = "Table", options={"collate"="utf8_bin"})
Run Code Online (Sandbox Code Playgroud)
由于我的一些复合主键由文本字段组成.可悲的是,'utf8_unicode_ci'将"poistný"和"poistny"解析为相同的主键值,并以插入flush的doctrine结束崩溃.我不能简单地更改复合主键的一部分的排序规则,不得不删除表并重新创建.希望它为别人节省时间..
归档时间: |
|
查看次数: |
37150 次 |
最近记录: |