标签:
网上查了一些mysql编码相关的资料,在这里整理下,不对的地方欢迎各位批评指正。
1. mysql字符集相关的变量:
- character_set_server:默认的内部操作字符集
– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_results:查询结果字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_system:系统元数据(字段名等)字符集
– 还有以collation_开头的同上面对应的变量,用来描述字符序。
2. mysql提供了不同粒度的字符集控制:
控制粒度 | 查看字符集 | |
|
character_set_connection | |
字段(field) | show full fields from TableName | |
表(table) | show create table TableName | |
数据库(database) | character_set_database 或 show create database DataBaseName | |
mysql服务器(server) | character_set_server |
在创建数据库、表、字段的时候,各个粒度上的字符集都是可以指定的,也可以不指定,这样的话就使用上一级默认的字符集。
下面分别看看创建数据库、表、字段时对字符集的控制。
3.1 创建数据库
(1)查看当前系统server字符集是latin1
(2)创建数据库(不指定编码)
可以看到新创建的数据库的字符集和server的字符集相同
(3)指定数据库字符集
新创建的数据库字符集和server字符集并不相同,而是使用了自己的字符集utf8
(4)修改server的字符集为utf8
(5)再次使用默认字符集创建数据库
新的数据库使用了和server相同的编码
3.2 创建表
(1)当前字符集设置
数据库编码为latin1
(2) 创建表
name字段指定了字符集为uft8, address字段采用默认设置
(3) 插入中文测试
可以看到,采用name字段正常显示,address字段出现了乱码
4. 实践建议
实践当中,建议创建数据库的时候就指定好db的字符集,如下:
create database testdb default charset utf8
之后创建表、字段的时候可以不指定字符集,默认集成db的字符集设定。
当然db创建好之后也可以修改db的编码:
ALTER DATABASE testdb DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
修改表的编码:ALTER TABLE test DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
修改字段的编码: ALTER TABLE test CHANGE address address VARCHAR( 45 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL
修改了address字段的编码,原先的数据仍然不能正常显示,因为之前插入数据的时候,客户端传入的是utf8格式,存在latin1无法编码的字符,数据在
进程字符集转换的时候出现了损坏,查询的时候已经无法得到完整的插入时的数据了
但是新插入的中文数据可以正常显示
参考:
标签:
原文地址:http://www.cnblogs.com/undefinedz/p/4696760.html