mysql4.1之后版本都支持多字符集的支持,可是安装默认的字符集居然是 latin1这个瑞典文,因此不少人想安装discuz等论坛为gbk、utf-8等字符集的论坛就出现了一些问题。最近我在网上找了一些资料,加上本身又专门在一台linux服务器上试验了两天的经历,基本解决了字符集的问题,现将个人心得写出来,供广大网游参考。
1、原理篇:
mysql服务器中有六个关键位置使用了字符集的概念,他们是:client 、connection、database、results、server 、system。
a、其中client是客户端使用的字符集,至关于网页中的字符集设置以下 php
<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库的设定决定本身的字符集,字段根据表来决定本身
的字符集。
2、统一字符集的方法:(以utf-8字符集为例,由于他是目前支持文字种类最广的字符集)
一、完全解决字符集的方法:
要完全解决字符集的方法就是让mysql在安装的时候就是用utf-8的字符集设定,这样可使上面的六个关键
点的编码都为utf-8。
a、 在windows下安装mysql有提示能够选择字符集,咱们选择utf-8就能够了。
b、在linux下有三种安装方法,第一种是rpm包安装,这种由于我没有使用过因此没有发言权。
第二种为可执行程序安装,这种安装由于已经被编译成了latin1这种瑞典语的字符集,因此没法彻底解决字
符集问题,这个版本咱们后面会讲到怎么解决字符集问题。
第三种为源码自行编译安装,这种安装能够在编译时设置字符集类型,这部分主要讲这种安装方式。
在编译mysql是咱们能够用这样的指令:./configure --default-character-set=utf8
这样,在编译的时候,就会把mysql的server项编译成utf8的编码,这样这个mysql下创建的全部数据库都将使用utf8
编码存储,全部有关的方面都是utf8编码。
二、局部坚定字符集的方法:
若是遇到本身的数据库使用的是默认安装的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)
这就说明,除system是utf8以外的全部内容的字符集都为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)
从上面能够看出,使用了配置文件中修改默认字符集的方法,并无把client、connection、
results这三项改为utf8,并且在建数据库的时候咱们能够经过这样的指令实现数据库的字符集设置:
这样此数据库内的全部表和字段都将为utf8字符集编码,因此在配置文件中修改的方法也就失去了意义。
b、个人解决办法。
咱们能够彻底无视数据库默认的字符集是什么,咱们关心的只有数据库在创建的时候是否是加入了字符集
选择。
(1)使用以下指令创建数据库:
PHP程序在查询数据库以前,执行mysql_query("set names utf8;");
例子:CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
(2)客户端php程序使用以下方法设定链接所使用的字符集:
(3)若是你想使用gb2312编码,那么建议你使用latin1做为数据表的默认字符集,这样就能直接用中
文在命令行工具中插入数据,而且能够直接显示出来.而不要使用gb2312或者gbk等字符集,若是担忧查询
排序等问题,可使用binary属性约束,例如:
create table my_table ( name varchar(20) binary not null default '')type=myisam default charset latin1;
自此,使用utf8字符集的完整的例子结束了。
3、旧数据升级办法
(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
set character_set_server = utf8;html
set characte_set_... = utf8;mysql