1、概述
MySQL字符集设置分为两类:
1)创建对象的默认值。
2)控制server和client端交互通信的配置。
1.1 创建对象的默认值
字符集合校对规则有4个级别的默认设置:
1)服务器级别;
2)数据库级别;
3)表级别、列级别;
4)连接级别。
更低级别的设置会集成高级别的设置。
这里有一个通用的规则:先为服务器或者数据库选择一个合理的字符集,然后根据不同的实际情况,让某个列选择自己的字符集。
1.2 控制server和client端交互通信的配置
大部分MySQL客户端都不具备同时支持多种字符集的能力,每次都只能使用一种字符集。
客户和服务器之间的字符集转换工作是由如下几个MySQL系统变量控制的。
1)character_set_server:MySQL服务端默认字符集。
2)character_set_database:数据库默认字符集。
3)character_set_client:MySQL服务端假定客户端发送的查询使用的字符集。
4)character_set_connection:MySQL服务端接收客户端发布的查询请求后,将其转换为character_set_connection变量指定的字符集。
5)character_set_results:MySQL服务端把结果集和错误信息转换为character_set_results指定的字符集,并发送给客户端。
6)character_set_system:系统元数据(字段名等)字符集
还有以collation_开头的同上面对应的变量,用来描述字符校对规则。
注意事项:
• my.ini中的default_character_set设置只影响mysql命令连接服务器时的连接字符集,不会对使用libmysqlclient库的应用程序产生任何作用!
• 对字段进行的SQL函数操作通常都是以内部操作字符集进行的,不受连接字符集设置的影响。
• SQL语句中的裸字符串会受到连接字符集或introducer设置的影响,对于比较之类的操作可能产生完全不同的结果,需要小心!
1.3 默认情况下字符集选择规则
(1)编译MySQL时,指定了一个默认的字符集,这个字符集是 latin1;
(2)安装MySQL时,可以在配置文件 (my.ini) 中指定一个默认的的字符集,如果没指定,这个值继承自编译时指定的;
(3)启动mysqld时,可以在命令行参数中指定一个默认的的字符集,如果没指定,这个值继承自配置文件中的配置,此时character_set_server被设定为这个默认的字符集;
(4)当创建一个新的数据库时,除非明确指定,这个数据库的字符集被缺省设定为character_set_server;
(5)当选定了一个数据库时,character_set_database被设定为这个数据库默认的字符集;
(6)在这个数据库里创建一张表时,表默认的字符集被设定为character_set_database,也就是这个数据库默认的字符集;
(7)当在表内设置一栏时,除非明确指定,否则此栏缺省的字符集就是表默认的字符集;
MySQL数据库乱码原因以及解决方案
乱码终极解决方案
1)首先要明确你的客户端时候何种编码格式,这是最重要的(IE6一般用utf8,命令行一般是gbk,一般程序是gb2312)
2)确保你的数据库使用utf8格式,很简单,所有编码通吃。
3)一定要保证connection字符集大于等于client字符集,不然就会信息丢失,比如: latin1 < gb2312 < gbk < utf8,若设置set character_set_client = gb2312,那么至少connection的字符集要大于等于gb2312,否则就会丢失信息
4)以上三步做正确的话,那么所有中文都被正确地转换成utf8格式存储进了数据库,为了适应不同的浏览器,不同的客户端,你可以修改character_set_results来以不同的编码显示中文字体,由于utf8是大方向,因此web应用是我还是倾向于使用utf8格式显示中文的。