数据库的字符集
在平时的数据库操作中,乱码问题是我们经常遇到的一个问题,而乱码其实就是字符集设置的不合适导致的。因此这里整理下数据库相关的字符集。
查看数据库当前支持的字符集
Default collation 为校对规则,以此决定字符的等价关系和大小关系。 其中ci是case insensitive即大小写不敏感, cs 为case sensitive 即大小写敏感。
MaxLen是用于存储一个字符的最大的字节数目
字符集相关的变量
查看数据库的字符集相关的变量如下:
参数
|
说明
|
---|---|
character_set_client | 客户端发送过来的数据使用的字符集 |
character_set_connection | 连接层字符集 |
character_set_database | 当前选中数据库的默认字符集 |
character_set_filesystem | 把os上文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的 |
character_set_results | 查询结果字符集 |
character_set_server | 默认的内部操作字符集 |
character_set_system | 系统元数据(字段名等)字符集 |
在MYSQL数据库中,提供了4中粒度的字符集。
- server:整个实例
- database:数据库
- table:表
- column: 列
上述4中的作用域依次递减、但是优先级依次递增。
一个完整的用户请求的字符集转换流程是
1) mysql Server收到请求时将请求数据从character_set_client转换为character_set_connection
2) 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,步骤如下
A. 使用每个数据字段(column)的CHARACTER SET设定值;
B. 若上述值不存在,则使用对应数据表(table)的字符集设定值
C. 若上述值不存在,则使用对应数据库(database)的字符集设定值;
D. 若上述值不存在,则使用character_set_server设定值。
3) 最后将操作结果从内部操作字符集转换为character_set_results
SET NAMES
mysql的配置文件或者启动时指定参数可以设置好mysql的上述参数。
同时还可以使用一些命令来设置当前会话使用的字符集,
常用的有SET NAMES
设置后
通过上述示例可以看出set names xxx 等价于同时设置 character_set_client、character_set_connection、character_set_results
上述设置只对当前会话生效。
SET CHARACTER SET
另外还有SET CHARACTER SET来设置
设置前:
设置后:(当前选中的数据库的的字符集为utf8)
即 SET CHARACTER SET X的效果相当于同时设置下列:
SET character_set_client = X
character_set_results = X
character_set_connection = @@character_set_database (全局的character_set_database值)
http://blog.csdn.net/wyzxg/article/details/8779682
http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html
http://dev.mysql.com/doc/refman/5.6/en/server-system-variables.html#sysvar_character_set_filesystem