mysql编码问题总结

网上查了一些mysql编码相关的资料,在这里整理下,不对的地方欢迎各位批评指正。

 

1. mysql字符集相关的变量:

- character_set_server:默认的内部操作字符集

– character_set_client:客户端来源数据使用的字符集

– character_set_connection:连接层字符集

– character_set_results:查询结果字符集

– character_set_database:当前选中数据库的默认字符集

– character_set_system:系统元数据(字段名等)字符集

– 还有以collation_开头的同上面对应的变量,用来描述字符序。

 

2. mysql提供了不同粒度的字符集控制:

控制粒度 查看字符集
连接(connection)
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无法编码的字符,数据在

进程字符集转换的时候出现了损坏,查询的时候已经无法得到完整的插入时的数据了

但是新插入的中文数据可以正常显示

 

 

参考:

mysql 更改库表字段的编码

mysql 字符集设置

 

posted @ 2015-08-02 21:16  undefinedz  阅读(344)  评论(0)    收藏  举报