网络书屋(Web Reading Room)

A blogging framework for hackers.

Mysql乱码回顾

mysql是一个中型的数据库操作系统平台,他的基本组成由存储引擎、各个命令模块、优化器、缓存器、解析器、用户模块、链接器(connector)等组成, mysql architect

其中存储引擎现在一般选用innodb居多(具体可以查看各个存储引擎的区别)

mysql操作级别:

  1. 数据库级别
  2. 表级别
  3. 字段级别

而这三个级别就影响这数据库的乱码级别。 一般事先使用show variables like '%char%' 来查看mysql的所有字符信息,参考mysql乱码解决, 根据该文基本上可以解决问题,另外可以进一步查看各个字符集和mysql查询涉及到的各个字符集的关系(对应命令的求解), 查阅了多个链接,都显示set names gbk对最终的显示有影响,根据我的使用经验来讲,

当你使用set names gbk则可以显示正常,而set names utf8则出现乱码

我在建立数据库的时候也使用了create database rupeng chracter set utf8等,但试过一遍只有最终加上set names gbk有效果。

1
2
3
4
set character_set_database=utf8;
set character_set_server=utf8;
set character_set_client=gbk;
set character_set_connection=gbk;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
系统变量:
client    为客户端使用的字符集。
connection    为连接数据库的字符集设置类型,如果程序没有指明连接数据库使用的字符集类型则按照服务器端默认的字符集设置。
database  为数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
results   为数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
server    为服务器安装时指定的默认字符集设定。
system    为数据库系统使用的字符集设定。

– character_set_client:客户端来源数据使用的字符集
– character_set_connection:连接层字符集
– character_set_database:当前选中数据库的默认字符集
– character_set_results:查询结果字符集
– character_set_server:默认的内部操作字符集
– character_set_system:系统元数据(字段名等)字符集

mysql字符集转换过程

1
2
3
4
5
6
7
8

1. MySQL Server收到请求时将请求数据从character_set_client转换为character_set_connection;
2. 进行内部操作前将请求数据从character_set_connection转换为内部操作字符集,其确定方法如下:
• 使用每个数据字段的CHARACTER SET设定值;
• 若上述值不存在,则使用对应数据表的DEFAULT CHARACTER SET设定值(MySQL扩展,非SQL标准);
• 若上述值不存在,则使用对应数据库的DEFAULT CHARACTER SET设定值;
• 若上述值不存在,则使用character_set_server设定值。
3. 将操作结果从内部操作字符集转换为character_set_results。

参考myeclipse-mysql,有一个原则就是不要让你的character出现latin1编码即可

我们操作所有数据库mysql中型,sqlite,postgreSql流行,db2(IBM)企业级,oracle大型运用企业级,informix(IBM), sql server