一、字符集及字符序的概念
字符(character)是人类语言最小的表义符号,例如‘A’,‘B’等。给定一系列字符,并对每一个字符予以数值,用数值代表对应的字符,这个数值就是字符的编码(character encoding)。所有这些“字符和编码对”组成的集合就是字符集(character set)。MySQL提供多种字符集,如latin1、utf8、gbk、big5等。
字符序(collation)是指同一个字符集内字符之间的比较规则。只有确定字符序后,才能在一个字符集上定义什么是等价的字符,以及字符之间的大小关系。一个字符可以包含多种字符序。MySQL字符序命名规则是:以字符序对应的字符集名称开头,以国家名居中(或以general居中),以ci、cs、或bin结尾。以ci结尾的字符序表示大小写不敏感,以cs结尾的字符序表示大小写敏感,以bin结尾的字符序表示按二进制编码值比较。
二、MySQL字符集与字符序
MySQL客户机连接上MySQL服务器后,使用MySQL命令:"show character set;"即可查看当前MySQL服务实例支持的字符集、字符序以及字符集占用的最大字节长度等信息。
使用MySQL命令:“show variables like 'character%';”即可查看当前MySQL会话使用的字符集,如下图所示,其中character_sets_dir参数定义了MySQL字符集文件的保存路径。
- character_set_client: 客户端来源数据使用的字符集
- character_set_connection: 数据通信链路的字符集,当MySQL客户机向服务器发送请求时,数据以该字符集进行编码
- character_set_database: 数据库字符集
- character_set_filesystem: MySQL服务器文件系统的字符集,该值是固定的binary。
- character_set_results: 结果集的字符集,MySQL服务器向MySQL客户机返回执行结果时,执行结果以该字符集进行编码
- character_set_server: 内部操作字符集(MySQL服务实例字符集)
- character_set_system: 元数据(字段名、表名、数据库名等)的字符集默认为utf8
三、MySQL字符集的转化过程
- 打开命令提示符窗口,命令提示符窗口自身存在某一种字符集,该字符集查看的方式:右击命令提示符标题栏,选择“默认值->选项->默认代码页”即可设置当前命令提示符窗口的字符集
- 在命令提示符窗口输入MySQL命令或sql语句,回车后,这些命令将会被转化为character_set_client定义的字符集
- 使用命令提示符窗口成功连接MySQL服务器后,就建立了一条”数据通信链路”。MySQL命令或者sql语句沿着这条”数据通信链路”传向MySQL服务器,由character_set_client定义的字符集转化为character_set_connection定义的字符集
- MySQL服务实例收到数据通信链路中的命令,将语句从character_set_connection定义的字符集转换为character_set_server定义的字符集。
- 若MySQL命令或sql语句针对某个数据库进行操作,此时将命令由character_set_server定义的字符集转换为character_set_database定义的字符集。
- MySQL命令或sql语句执行结束后,将执行结果设置为character_set_result定义的字符集。
- 执行结果沿着打开的数据链路原路返回,将执行结果转换为character_set_client定义的字符集,最终转换为命令提示符窗口字符集显示在命令提示符窗口。
四、MySQL字符集的设置
Windows下
修改my.ini配置文件,可修改MySQL默认字符集。
在【mysql】选项组中加入:default-character-set=utf8
在【mysqld】选项组中加入:character_set_server=utf8
保存后重启数据库即可
Linux下
- 关闭MySQL服务:service mysql stop;
修改/etc/mysql/my.cnf配置文件
在文件内的【mysqld】下添加两行
重启MySQL服务:service mysql start;
至此,完成修改默认编码,登陆MySQL后查看效果如下:
Ubuntu MySQL 启动 停止 重启
- 启动:sudo /etc/init.d/mysql start;
- 停止: sudo /etc/init.d/mysql stop;
- 重启: sudo /etc/init.d/mysql restart;
五、其他基本命令
查看字符集
1.show variables like 'character%';
2.show variables like 'character_set_%';
设置数据库字符集
1.alter database test default character set = utf8;
2.create database mydb character set utf8;
修改单个表的字符集
1.alter table test1 default character set = utf8;
2.alter table test2 convert to character set utf8;
使用MySQL字符集的建议
- 建立数据库/表和进行数据库操作时尽量显式指出使用的字符集,而不是依赖于MySQL的默认设置,否则MySQL升级时可能带来很大的困扰
- 数据库和连接字符集都使用latin1时,虽然大部分情况下都可以解决乱码的问题,但是缺点是无法以字符为单位进行SQL操作,一般情况下将数据库和连接字符集都设置为utf8是较好的选择
- 对于MySQL PHP API ,一般页面级的PHP程序总运行时间较短,在连接数据库以后显式用SET NAMES语句设置一次连接字符集即可;但当长时间连接时,请注意保持连接通畅并在断开重连后用SET NAMES语句显式重置连接字符集