Mysql中utf8的校对规则
⽤了这么长时间,发现⾃⼰竟然不知道utf_bin和utf_general_ci这两者到底有什么区别。。
ci是 case insensitive, 即 "⼤⼩写不敏感", a 和 A 会在字符判断中会被当做⼀样的;
bin 是⼆进制, a 和 A 会别区别对待.
例如你运⾏:
SELECT * FROM table WHERE txt = 'a'
那么在utf8_bin中你就不到 txt = 'A' 的那⼀⾏, ⽽ utf8_general_ci 则可以.
utf8_general_ci 不区分⼤⼩写,这个你在注册⽤户名和邮箱的时候就要使⽤。
utf8_general_cs 区分⼤⼩写,如果⽤户名和邮箱⽤这个就会照成不良后果
utf8_bin:字符串每个字符串⽤⼆进制数据编译存储。区分⼤⼩写,⽽且可以存⼆进制的内容
⼀、官⽅⽂档说明
下⾯摘录⼀下Mysql 5.1中⽂⼿册中关于utf8_unicode_ci与utf8_general_ci的说明:
当前,utf8_unicode_ci校对规则仅部分⽀持Unicode校对规则算法。⼀些字符还是不能⽀持。并且,不能完全⽀持组合的记号。这主要影响越南和俄罗斯的⼀些少数民族语⾔,如:Udmurt 、Tatar、Bashkir和Mari。
utf8_unicode_ci的最主要的特⾊是⽀持扩展,即当把⼀个字母看作与其它字母组合相等时。例如,在德语和⼀些其它语⾔中'ß'等于'ss'。
utf8_general_ci是⼀个遗留的校对规则,不⽀持扩展。它仅能够在字符之间进⾏逐个⽐较。这意味着utf8_general_ci校对规则进⾏的⽐较速度很快,但是与使⽤utf8_unicode_ci的校对规则相⽐,⽐较正确性较差)。
例如,使⽤utf8_general_ci和utf8_unicode_ci两种校对规则下⾯的⽐较相等:
Ä = A
Ö = O
Ü = U
两种校对规则之间的区别是,对于utf8_general_ci下⾯的等式成⽴:
ß = s
但是,对于utf8_unicode_ci下⾯等式成⽴:
ß = ss
对于⼀种语⾔仅当使⽤utf8_unicode_ci排序做的不好时,才执⾏与具体语⾔相关的utf8字符集校对规则。例如,对于德语和法
语,utf8_unicode_ci⼯作的很好,因此不再需要为这两种语⾔创建特殊的utf8校对规则。
utf8_general_ci也适⽤与德语和法语,除了'ß'等于's',⽽不是'ss'之外。如果你的应⽤能够接受这些,那么应该使⽤utf8_general_ci,因为它速度快。否则,使⽤utf8_unicode_ci,因为它⽐较准确。
如果你想使⽤gb2312编码,那么建议你使⽤latin1作为数据表的默认字符集,这样就能直接⽤中⽂在命令⾏⼯具中插⼊数据,并且可以直接显⽰出来.⽽不要使⽤gb2312或者gbk等字符集,如果担⼼查询排序等问题,可以使⽤binary属性约束,例如:
create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1;
⼆、简短总结
utf8_unicode_ci和utf8_general_ci对中、英⽂来说没有实质的差别。
utf8_general_ci校对速度快,但准确度稍差。
utf8_unicode_ci准确度⾼,但校对速度稍慢。
如果你的应⽤有德语、法语或者俄语,请⼀定使⽤utf8_unicode_ci。⼀般⽤utf8_general_ci就够了,到现在也没发现问题。。。
三、详细总结
1、对于⼀种语⾔仅当使⽤utf8_unicode_ci排序做的不好时,才执⾏与具体语⾔相关的utf8字符集校对规则。例如,对于德语和法
语,utf8_unicode_ci⼯作的很好,因此不再需要为这两种语⾔创建特殊的utf8校对规则。
2、utf8_general_ci也适⽤与德语和法语,除了'?'等于's',⽽不是'ss'之外。如果你的应⽤能够接受这些,那么应该使⽤ utf8_general_ci,因为它速度快。否则,使⽤utf8_unicode_ci,因为它⽐较准确。
⽤⼀句话概况上⾯这段话:utf8_unicode_ci⽐较准确,utf8_general_ci速度⽐较快。通常情况下 utf8_general_ci的准确性就够我们⽤的了,在我看过很多程序源码后,发现它们⼤多数也⽤的是utf8_general_ci,所以新建数据库时⼀般选⽤utf8_general_ci就可以了
四、如何在MySQL5.0中使⽤UTF8
在 myf中增加下列参数
[mysqld]
init_connect='SET NAMES utf8′
default-character-set=utf8
default-collation = utf8_general_ci
执⾏查询 mysql> show variables; 相关如下:
character_set_client | utf8
character_set_connection | utf8
character_set_database | utf8
character_set_results | utf8
character_set_server | utf8
character_set_system | utf8
collation_connection | utf8_general_ci
collation_database | utf8_general_ci
collation_server | utf8_general_ci
个⼈见解,对于数据库的使⽤,utf8 - general 已经⾜够的准确,并且相较与 utf8 - unicode速度上有优势,固可放⼼采⽤之
mysql下载后为啥localhost打不开附1:旧数据升级办法
以原来的字符集为latin1为例,升级成为utf8的字符集。原来的表: old_table (default charset=latin1),新表:new_table(default
charset=utf8)。
第⼀步:导出旧数据
mysqldump --default-character-set=latin1 -hlocalhost -uroot -B my_db --tables old_table > old.sql
第⼆步:转换编码(类似unix/linux环境下)
iconv -t utf-8 -f gb2312 -c old.sql > new.sql
或者可以去掉 -f 参数,让iconv⾃动判断原来的字符集
iconv -t utf-8 -c old.sql > new.sql
在这⾥,假定原来的数据默认是gb2312编码。
第三步:导⼊
修改old.sql,在插⼊/更新语句开始之前,增加⼀条sql语句: "SET NAMES utf8;",保存。
mysql -hlocalhost -uroot my_db < new.sql
⼤功告成!!
附2:⽀持查看utf8字符集的MySQL客户端有
1.) MySQL-Front,据说这个项⽬已经被MySQL AB勒令停⽌了,不知为何,如果国内还有不少破解版可以下载(不代表我推荐使⽤破解版 :-P)。
2.) Navicat,另⼀款⾮常不错的MySQL客户端,版刚出来,还邀请我试⽤过,总的来说还是不错的,不过也需要付费。
3.) PhpMyAdmin,开源的php项⽬,⾮常好。
4.) Linux下的终端⼯具(Linux terminal),把终端的字符集设置为utf8,连接到MySQL之后,执⾏ SET NAMES UTF8; 也能读写utf8数据了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论