mysql字符编码的搜集

来源:互联网 发布:安全员模拟考试软件 编辑:程序博客网 时间:2024/06/14 11:21

mysql字符集编码向来是一个难题,因为有时候为大多数人想的UTF8可以解决一些难题,不过不要太理想化了,有时候在window客户端下 修改成utf8,mysql是不支持的,所以还得具体问题具体分析,可是这个还真得需要你花点时间来研究

下面是一些别人的文章,在此先谢了


             mysql
服务器中有六个关键位置使用了字符集的概念,他们是:clientconnectiondatabaseresultsserversystem

             a
、其中client是客户端使用的字符集,相当于网页中的字符集设置如下

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
b
、其中的connection是连接数据库的字符集设置类型,如果php没有指明连接数据库使用的字符集类型
就按照服务器端默认的字符集设置。
c
、其中database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装
时指定的字符集设置。
d
results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。
e
server是服务器安装时指定的默认字符集设定。
f
system是数据库系统使用的字符集设定。

system
一般默认是utf-8字符集,server是最高的字符集设定,database没有单独设定就按照server的字符
集设定,其他都是按照server的设定设置字符集。还有,数据库内的每个表和字段也都有字符集的概念,一般都
是根据上一级结构决定自身的字符集,比如表就根据database库的设定决定自己的字符集,字段根据表来决定自己
的字符集。

二、统一字符集的方法:(以utf-8字符集为例,因为他是目前支持文字种类最广的字符集)

1
、彻底解决字符集的方法:

要彻底解决字符集的方法就是让mysql在安装的时候就是用utf-8的字符集设定,这样可以使上面的六个关键
点的编码都为utf-8

a
、 在windows下安装mysql有提示可以选择字符集,我们选择utf-8就可以了。

b
、在linux下有三种安装方法,第一种是rpm包安装,这种因为我没有使用过所以没有发言权。

第二种为可执行程序安装,这种安装因为已经被编译成了latin1这种瑞典语的字符集,所以无法完全解决字
符集问题,这个版本我们后面会讲到怎么解决字符集问题。
第三种为源码自行编译安装,这种安装可以在编译时设置字符集类型,这部分主要讲这种安装方式。

在编译mysql是我们可以用这样的指令:./configure --default-character-set=utf8
这样,在编译的时候,就会把mysqlserver项编译成utf8的编码,这样这个mysql下建立的所有数据库都将使用utf8
编码存储,所有有关的方面都是utf8编码。


2
、局部坚决字符集的方法:

如果遇到自己的数据库使用的是默认安装的latin1字符集的(很奇怪为什么mysql要使用这么个默认字符集)
的情况我们可以这样来解决。

a
、默认请况下我们在mysql命令行使用status指令察看状态,可以看到如下内容:

mysql> status
--------------
mysql Ver 14.7 Distrib 4.1.9, for pc-linux-gnu (i686)

Connection id:         62
Current database:
Current user:          root@localhost
SSL:                   Not in use
Current pager:         stdout
Using outfile:         ''
Using delimiter:       ;
Server version:        5.1.11-beta-log
Protocol version:      10
Connection:            Localhost via UNIX socket
Server characterset:   latin1
Db    characterset:   latin1
Client characterset:   latin1
Conn. characterset:   latin1
UNIX socket:           /tmp/mysql.sock
Uptime:                58 min 23 sec

Threads: 2 Questions: 1067 Slow queries: 0 Opens: 0 Flush tables: 1 Open tables: 75 Queries per second avg: 0.305
--------------

  
还可以用SHOW VARIABLES LIKE 'character_set_%';指令察看内容如下:

+--------------------------+---------------------------------------------------------------------------+
| Variable_name           | Value                                                                    |
+--------------------------+---------------------------------------------------------------------------+
| character_set_client    | latin1                                                                   |
| character_set_connection | latin1                                                                   |
| character_set_database  | latin1                                                                   |
| character_set_filesystem | binary                                                                   |
| character_set_results   | latin1                                                                   |
| character_set_server    | latin1                                                                   |
| character_set_system    | utf8                                                                     |
| character_sets_dir      | /usr/local/src/mysql-5.1.11-beta-linux-i686-glibc23/share/mysql/charsets/ |
+--------------------------+---------------------------------------------------------------------------+
8 rows in set (0.00 sec)

这就说明,除systemutf8之外的所有内容的字符集都为latin1,我们怎么样才能使用utf字符集呢?
有人说可以在my.cnf文件的[mysqld]段中加入default-character-set=utf8这一项就可以解决,但经过我的实验,这一条
完全没有必要,以下是增加了这一项后得显示结果。

mysql> status;
--------------
mysql Ver 14.7 Distrib 4.1.9, for pc-linux-gnu (i686)

Connection id:         62
Current database:
Current user:          root@localhost
SSL:                   Not in use
Current pager:         stdout
Using outfile:         ''
Using delimiter:       ;
Server version:        5.1.11-beta-log
Protocol version:      10
Connection:            Localhost via UNIX socket
Server characterset:   latin1
Db    characterset:   utf8
Client characterset:   utf8
Conn. characterset:   latin1
UNIX socket:           /tmp/mysql.sock
Uptime:                1 hour 6 min 18 sec

Threads: 2 Questions: 1071 Slow queries: 0 Opens: 0 Flush tables: 1 Open tables: 75 Queries per second avg: 0.269
--------------

mysql> SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+---------------------------------------------------------------------------+
| Variable_name           | Value                                                                    |
+--------------------------+---------------------------------------------------------------------------+
| character_set_client    | latin1                                                                   |
| character_set_connection | latin1                                                                   |
| character_set_database  | utf8                                                                     |
| character_set_filesystem | binary                                                                   |
| character_set_results   | latin1                                                                   |
| character_set_server    | utf8                                                                     |
| character_set_system    | utf8                                                                     |
| character_sets_dir      | /usr/local/src/mysql-5.1.11-beta-linux-i686-glibc23/share/mysql/charsets/ |
+--------------------------+---------------------------------------------------------------------------+
8 rows in set (0.00 sec)


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


从上面可以看出,使用了配置文件中修改默认字符集的方法,并没有把clientconnection
results
这三项改成utf8,而且在建数据库的时候我们可以通过这样的指令实现数据库的字符集设置:

CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

      
这样此数据库内的所有表和字段都将为utf8字符集编码,所以在配置文件中修改的方法也就失去了意义。


b
、我的解决办法。

我们可以完全无视数据库默认的字符集是什么,我们关心的只有数据库在建立的时候是不是加入了字符集
选择。

(1)
使用如下指令建立数据库:


CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

(2)
客户端php程序使用如下方法设定连接所使用的字符集:
     PHP
程序在查询数据库之前,执行mysql_query("set names utf8;");

     
例子:

  1. <?php
  2. mysql_connect('localhost','user','password');
  3. mysql_select_db('my_db');
  4. //请注意,这步很关键,如果没有这步,所有的数据读写都会不正确的
  5. //它的作用是设置本次数据库联接过程中,数据传输的默认字符集
  6. mysql_query("set names utf8;");
  7. //必须将gb2312(本地编码)转换成utf-8,也可以使用iconv()函数
  8. mysql_query(mb_convet_encoding("insert into my_table values('测试');","utf-8","gb2312"));
  9. ?>

(3)如果你想使用gb2312编码,那么建议你使用latin1作为数据表的默认字符集,这样就能直接用中
文在命令行工具中插入数据,并且可以直接显示出来.而不要使用gb2312或者gbk等字符集,如果担心查询
排序等问题,可以使用binary属性约束,例如:

create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1;

自此,使用utf8字符集的完整的例子结束了。

三、旧数据升级办法

(1)导出数据库:

mysqldump -uroot -p123456 --default-character-set=latin1 --set-charset=utf8 --opt olddatabase > newdatabase.sql

(2)
修改newdatabase.sql,在文件开头增加一条sql语句:SET NAMES utf8;,保存。

(3)mysql -hlocalhost -uroot my_db < newdatabase.sql

下面是一些参考的文章:

http://topic.csdn.net/u/20071124/08/3b7eae69-ed1d-4a77-8895-9930bf3601af.html  字符编码的汇总。

http://pepa.javaeye.com/blog/295151 ps:常见的问题 还没有好的解决办法。

http://dev.mysql.com/doc/refman/5.1/zh/charset.html#charset-general ps:官方网站 很详细,可是看了还是没有感觉。

 

原创粉丝点击