一、字符集的选择
(1)如果应用要处理各种各样的文字,或者将发布到使用不同语言的国家或者地区,就应该选择Unicode字符集。对MySQl来说目前就是UTF-8
(2)如果应用中涉及已有数据的导入,就要充分考虑数据库字符集对已有数据的兼容性。
(3)只需要支持一般中文,数据量很大,行呢要求很高,则应该选择双字节定长编码的中文字符集,GBK等。
(4)主要处理英文字符,仅有少量汉字数据,那么选UTF-8
(5)若需要做大量的字符运算,如比较、排序等,那么选择定长字符集可能更好,因为比变成字符集的处理速度快
(6)如果所有客户端都支持相同的字符集,则应该优先选择该字符集作为数据库字符集。
2、MySQL支持的字符集
(1)同一台服务器、同一个数据库、用一个表的不同字段都可以指定使用不同的字符集。
(2)查看所有可用的字符集:show charactor set;
显示所有的字符集和该字符集默认的校对规则:
desc information_schema.character_sets;
(3)字符集:定义MySQL存储字符串的方式。30多种
校对规则:定义比较字符串的方式。70多种。校验规则命名约定:字符集名称+语音民名+:_ci大小写不敏感,_cs大小写敏感,_bin二元,即笔记是基于字符编码的值而与language无关
字符集:校对规则=1:n
(4)查看相关字符集的校对规则:
show collation like 'gbk%';
通过系统表information_schema.COLLATIONS
3、MYSQL字符集的设置
(1)mysql的字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和字段级。
(2)服务器字符集和校对规则
a.可在服务器启动的时候确定。
b.可以在my.cnf中设置:
[mysqld]
character-set-server=gbk
c.在启动选项中指定:
mysqld --charactor-set-server=gbk
d.在编译时自定:
shell> cmake . -DDEFAULT_CHARSET=gbk
e.默认字符集:latin1
f.查询当前服务器的字符集和校对规则:
show variables like 'character_set_server';
show variables like 'collation_server';
(3)表字符集和校对规则
如果表中已有记录,修改字符集对原有的记录并没有影响,不会按照新的字符集进行存放,表的字段仍然使用原来的字符集。
推荐在创建表的时候明确指定字符集和校对规则,以免受到默认值的影响。
(4)列字符集和校对规则
相同的表不同字段需要使用不同的字符集。
创建表时指定、修改表时调整
(5)连接字符集和校对规则
上面4种设置方式,确定的是数据保存的字符集和校对规则。但是对于实际的应用访问来说,还存在客户端和服务器之间交互的字符集和校对规则的设置。3个不同的参数:character_set_client、character_set_connection和character_set_results分别代表客户端、连接和返回结果的字符集。通常这3个参数相同才能保证写入正确的读出。
SET NAMES ***;命令同时修改这3个参数的值。需要应用每次连接数据库后都执行这个命令。
在my.cnf中设置:
[mysql]
default-charater-set=gbk
服务器启动后,所有连接默认就是使用GBK字符集进行连接的,而不需要在程序中再执行set names命令。字符串常量的字符集也是由character_set_connection参数来指定的。
通过[_charset_name]'string'[COLLATE collation_name]命令强制字符串的字符集和校对规则。(通常基本不需要用户强制指定字符串字符集)
select _gbk '字符集'
select _latin1 '字符集'
4、字符集的修改步骤
(1)不能直接通过alter database character set ***或者alter table tablename character set ***命令进行。这2个命令都没有更新已有记录的字符集,而只是对新创建的表或者记录生效。
(2)已有记录的字符集调整,需要先将数据导出,警告适当的调整重新导入后才可完成。