在解决一个jsp乱码问题时,查到了mysql的字符集,从mysql的参考手册上找出了一下内容:并做一下总结:
character_set_system: 元数据字符集,(对数据的数据类型的定义),由于unicode是双字节编码,它可以包含几乎所有的文字的编码,所以把它做元数据类型,其他的编码集都可以包含在unicode内,应该是出于空间考虑就选择了utf8. :character_set_system | utf8
character_set_server :服务器级别的字符集,对应 my.ini中的[mysqld]default-character-set=xx
character_set_database:数据库级别的字符集, 对应 create database xxx DEFAULT CHARACTER SET XXX
character_set_client : 指定的是客户端Sql语句的编码,这是用户告诉MySQL查询是用的什么字符集,或者说客户端的查询语句的字符集。
character_set_connection :指定了mysql用来运行sql语句的时候使用的编码,, MySQL接受到用户查询后,按照character_set_client将其转化为character_set_connection设定的字符集。
character_set_results : MySQL将存储的数据(character_set_system)转换成character_set_results中设定的字符集发送给用户。
程序在拿到 resultset时,resultset的编码和character_set_results是一致的,在character_set_results的基础上转换成和page encode的一致,就可以解决从数据库读出来的乱码问题了。
<@page import="" pageencode="GBK">
<%=new String(rs.getString(1).getBite(character_set_results),"GBK")%>
这里有有个问题,能否在程序中直接得到mysql的character_set_results?
附录:
MySQL5.1能够做这些事情:
· 使用多种字符集来存储字符串
· 使用多种校对规则来比较字符串
· 在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字符串
· 允许定义任何级别的字符集和校对规则
字符集和校对规则有4个级别的默认设置:服务器级、数据库级、表级和连接级。
character_set_system : 对数据的数据类型的定义,用于元数据的UTF8,
元数据是“关于数据的数据”。描述数据库的任何数据—作为数据库内容的对立面—是元数据。因此,列名、数据库名、用户名、版本名以及从SHOW语句得到的结果中的大部分字符串是元数据。还包括INFORMATION_SCHEMA数据库中的表中的内容,因为定义的那些表存储关于数据库对象的信息。
元数据表述必须满足这些需求:
· 全部元数据必须在同一字符集内。否则,对INFORM一个TION_SCHEMA数据库中的表执行的SHOW命令和SELECT查询不能正常工作,因为这些运算结果中的同一列的不同行将会使用不同的字符集。
· 元数据必须包括所有语言的所有字符。否则,用户将不能够使用它们自己的语言来命名列和表。
为了满足这两个需求,MySQL使用Unicode字符集存储元数据,即UTF8。如果你从不使用重音字符,这不会导致任何破坏。但如果你使用重音字符,应该注意的是元数据是用UTF8存储。
这意味着,USER()、CURRENT_USER()、DATABASE()和VERSION()函数的返回值被默认设置为UTF8字符集,这与同义函数如SESSION_USER()和SYSTEM_USER()的结果相同。
服务器将character_set_system系统变量设置为元数据字符集的名,所以查看 character_set_system 始终是utf8
character_set_server 对应 my.ini中的[mysqld]default-character-set=xx
character_set_database 对应 create database xxx DEFAULT CHARACTER SET XXX
character_set_client ,这是用户告诉MySQL查询是用的什么字符集。
character_set_connection ,MySQL接受到用户查询后,按照character_set_client将其转化为character_set_connection设定的字符集。
character_set_results , MySQL将存储的数据(character_set_system)转换成character_set_results中设定的字符集发送给用户。
SET NAMES 'x'语句与这三个语句等价:
mysql> SET character_set_client = x; mysql> SET character_set_results = x; mysql> SET character_set_connection = x;
character_set_client指定的是Sql语句的编码,如果设置为 binary,mysql就当二进制来处理,
character_set_connection指定了mysql用来运行sql语句的时候使用的编码,
也就是说,程序发送给MySQL的SQL语句,会首先被MySQL从character_set_client指定的编码转换到character_set_connection指定的编码,
如果character_set_clien指定的是binary,则MySQL就会把SQL语句按照character_set_connection指定的编码解释执行.
当执行SQL语句的过程中,比如向数据库中插入字段的时候,字段也有编码设置,如果字段的编码设置和character_set_connection指定的不同,则MySQL会把插入的数据转换成字段设定的编码。SQL语句中的条件判断和SQL插入语句的执行过程类似.
当SQL执行完毕像客户端返回数据的时候,会把数据从字段指定的编码转换为character_set_results指定的编码,如果character_set_results=NULL则不做任何转换动作,(注意这里设置为NULL不等于没有设置,没有设置的时候MySQL会继承全局设置),
工作中比较有用的就是利用MySQL进行转码、不同编码的数据库之间共用数据。