您的位置:首页 > 数据库 > MySQL

MySQL字符集问题解决方法(包括改配置文件、命令行修改和JDBC的问题)

2008-12-11 10:25 1006 查看
转自

http://blog.csdn.net/chho/archive/2005/02/25/302166.aspx

http://www.phpchina.com/html/24/32724-10431.html

MySQL 4.1的字符集支持(Character Set Support)有两个方面:字符集(Character
set)和排序方式(Collation)。对于字符集的支持细化到四个层次:
服务器(server),数据库(database),数据表(table)和连接(connection)。

查看系统的字符集和排序方式的设定可以通过下面的两条命令:

mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)

mysql> SHOW VARIABLES LIKE 'collation_%';
+----------------------+-------------------+
| Variable_name | Value |
+----------------------+-------------------+
| collation_connection | latin1_swedish_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

上面列出的值就是系统的默认值。

一般就算设置了表的默认字符集为utf8并且通过UTF-8编码发送查询,你会发现存入数据库的仍然是乱码。问题就出在这个connection连接层上。解决方法是在发送查询前执行一下下面这句:

SET NAMES 'utf8';

它相当于下面的三句指令:
SET character_set_client = utf8;
SET character_set_results = utf8;
SET character_set_connection = utf8;

PHPChina 开源社区门户3D3K[&q:g
OR rPHPChina 开源社区门户M
kgU_7~|

看看这3个变量的作用:
信息输入路径:client→connection→server;

信息输出路径:server→connection→results。


句话说,每个路径要经过3次改变字符集编码。以出现乱码的输出为例,server里utf8的数据,传入connection转为latin1,传入
results转为latin1,utf-8页面又把results转过来。如果两种字符集不兼容,比如latin1和utf8,转化过程就为不可逆的,
破坏性的。所以就转不回来了。

U,r1h B&o%b0PHPChina 开源社区门户)Tz.S:z"iKPHPChina 开源社区门户w${+X:^pU3a9zo
p
4Y1koD$i A9Cilo0但这里要声明一点,“SET NAMES UTF8”作用只是临时的,MySQL重启后就恢复默认了。

MySQL 5.0 手册上说明:

PHPChina 开源社区门户M@ Q./'C+Z?

With the mysql client, it is not necessary to
execute
SET NAMES
every time you start up if
you want to use a character set different from the default. You
can add the
--default-character-set
mysql statement line, or in
your option file. For example, the following option file setting
changes the three character set variables set to
koi8r
each time you invoke
mysql:
option
setting to your

[mysql]
default-character-set=koi8r


If you are using the mysql client with
auto-reconnect enabled (which is not recommended), it is
preferable to use the
charset
command rather
than
SET NAMES
. For example:

mysql> [code]charset utf8

Charset changed
[/code]

The
charset
command issues a
SET
NAMES
statement, and also changes the default
character set that is used if mysql
reconnects after the connection has dropped.

而MySQL数据库的4.1是一个分水岭,4.1直接支持Unicode,它以下版本支持的不好;

MySQL
JDBC Driver的3.0.16也是一个分水岭,3.0.16版本会取数据库本身的编码,然后按照该编码转换,这种方式和Oracle的JDBC
Driver是一样的。例如你的数据库是GBK编码的话,JDBC
Driver就会把数据库里面的取出来的字符串按照GBK往unicode转换,送给JVM。因此正确的设置数据库本身的编码就尤为重要。

MySQL
JDBC
Driver3.0.16以下的版本则不然,它不会那么智能的根据数据库编码来确定如何转换,它总是默认使用ISO8859-1,因此你必须使用
characterEncoding=GBK来强制他把数据库中取出来的字符串按照GBK来往unicode转换。

因此,使用什么数据库版本,不管是3.x,还是4.0.x还是4.1.x,其实对我们来说不重要,重要的有二:

1)
正确的设定数据库编码,MySQL4.0以下版本的字符集总是默认ISO8859-1,MySQL4.1在安装的时候会让你选择。如果你准备使用UTF-
8,那么在创建数据库的时候就要指定好UTF-8(创建好以后也可以改,4.1以上版本还可以单独指定表的字符集)

2) 使用3.0.16以上版本的JDBC Driver,那么你就不需要再写什么characterEncoding=UTF-8
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐