Mysql中文乱码问题解决方案

一、显示字符集相关的变量值

mysql> show variables like 'chara%';
mysql> show variables like 'collation%';

collation是与排序相关的字符集变量, 上述变量值是mysql中缺省的字符集变量。

二、字符集相关各变量的意义
character_set_client: 客户端字符集(应用程序客户端使用的字符集),实际上它与当前会话相关。
character_set_connection: 连接字符集,指的是mysql网络传输中使用的字符集,也与会话相关。
character_set_database: 指的数据库表中物理存储使用的字符集。
character_set_results: 指的是使用sql查询处理以后返回结果使用的字符集。
character_set_server:指的是mysql数据库服务器端使用的字符集。
character_set_system:指的是数据库中存储元信息使用的字符集。

collation_connection:意义可以类推

三、字符集的修改
对单个变量进行修改
set character_set_client=gbk
使用set names 来同时修改几个变量
set names 'gbk' 可一下子全部修改字符集
等价于:
SET character_set_client = x;
SET character_set_results = x;
SET character_set_connection = x;

注意:collation_connection变量缺省下与character_set_connection是相关联的,即
collation_connection取决于character_set_connection的值。
如:

mysql> set names 'gbk';
Query OK, 0 rows affected (0.08 sec)

mysql> show variables like 'chara%';
+--------------------------+-------------------------------------------+
| Variable_name            | Value                                     |
+--------------------------+-------------------------------------------+
| character_set_client     | gbk                                       |
| character_set_connection | gbk                                       |
| character_set_database   | latin1                                    |
| character_set_results    | gbk                                       |
| character_set_server     | latin1                                    |
| character_set_system     | utf8                                      |
| character_sets_dir       | d:/mysql-5.0.9-beta-win32/share/charsets/ |
+--------------------------+-------------------------------------------+
7 rows in set (0.00 sec)

mysql> show variables like 'collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | gbk_chinese_ci    |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)
我们可以看到 set names 'gbk'改变了character_set_client, character_set_connection, character_set_results, collation_connection的值.
如果要单独指定collation_name,可以使用
SET NAMES 'charset_name' COLLATE 'collation_name'

另一种修改多个变量的命令是:
SET CHARACTER SET x  等价于:
SET character_set_client = x;
SET character_set_results = x;
SET collation_connection = @@collation_database;
你可以自己体验一下该命令带来的字符集变量值的变动。

那么character_set_server, character_set_database的值怎么修改呢?直接在命令行里修改是不起作用的。
最好的方式是在配置文件my.ini中直接修改,在[mysqld]项下边添加:
default_character_set=GBK
当然,你如果想尝试,使用mysqld-nt --default_character_set=GBK来启动数据库也未尝不可,但我并不推荐这么做。

my.ini文件的搜索顺序是:
在版本4.1.5之前,必须在c:/my.cnf or c:/Windows/my.in下边,这个有待检验。
在后续版本里,my.ini缺省就在mysql的安装目录下边。

强调一点:
mysql --default-character-set=gbk -u root

mysql --defaults-file=c:/my.ini -u root
在my.ini中添加如下内容
[mysql] or [client]
default-character-set=gbk

mysql -u root
再执行set names 'gbk'
这三者效果完全一样。

四、乱码的产生
乱码的产生主要是由于字符集变量设置的不一致造成的。
操作系统有一个在显示字符时要使用的locale变量,linux下使用locale命令可以看到。
windows下使用chcp可以看到,gbk对应的code page应该是936。
如果操作系统安装了当前字符集与目标字符集的转换表,则能正确显示目标字符集中的字符,否则就会出现乱码。
latin1对应的是iso8859_1字符集,默认情况下,可以与gbk相互转换,至少在操作系统一级是这样。


我的解决方案:
执行 set character_set_server=utf8;等(其他几个)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值