首页 > 数据库 > MYSQL字符集

MYSQL字符集

2009年04月20号
查看评论 发表评论 700次浏览

mysql4.1以后版本都支持多字符集的支持,安装默认的字符集是 latin1 瑞典文,所以很多人想安装discuz等论坛为gbk、utf-8等字符集的论坛就出现了一些问题。
mysql数据库中有六个关键位置使用了字符集的概念:
client 、connection、database、results、server 、system。

1、其中client是客户端使用的字符集,相当于网页中的字符集设置如下
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″>。
2、其中的connection是连接数据库的字符集设置类型,如果php没有指明连接数据库使用的字符集类型就按照服务器端默认的字符集设置。
3、其中database是数据库服务器中某个库使用的字符集设定,如果建库时没有指明,将使用服务器安装时指定的字符集设置。
4、results是数据库给客户端返回时使用的字符集设定,如果没有指明,使用服务器默认的字符集。5、server是服务器安装时指定的默认字符集设定。
6、system是数据库系统使用的字符集设定。
system一般默认是utf-8字符集,server是最高的字符集设定,database没有单独设定就按照server的字符集设定,其他都是按照server的设定设置字符集。数据库内的每个表和字段也都有字符集的概念,一般都是根据上一级结构决定自身的字符集,比如表就根据database库的设定决定自己的字符集,字段根据表来决定自己的字符集。
统一字符集的方法:(以utf-8字符集为例,因为他是目前支持文字种类最广的字符集)
要彻底解决字符集的方法就是让mysql在安装的时候就是用utf-8的字符集设定,这样可以使上面的六个关键点的编码都为utf-8。
在windows下安装mysql有提示可以选择字符集,我们选择utf-8就可以了。
在linux下有三种安装方法,第一种是rpm包安装,这种因为我没有使用过所以没有发言权。
第二种为可执行程序安装,这种安装因为已经被编译成了latin1这种瑞典语的字符集,所以无法完全解决字符集问题,这个版本我们后面会讲到怎么解决字符集问题。
第三种为源码自行编译安装,这种安装可以在编译时设置字符集类型,这部分主要讲这种安装式。
在编译mysql是我们可以用这样的指令:./configure –default-character-set=utf8这样,在编译的时候,就会把mysql的server项编译成utf8的编码,这样这个mysql下建立的所有数据库都将使用utf8编码存储,所有有关的方面都是utf8编码.
局部解决字符集的方法:

如果遇到自己的数据库使用的是默认安装的latin1字符集的可以这样来解决。
默认请况下我们在mysql命令行使用status指令察看状态,可以看到如下内容:
mysql> status————–mysql Ver 14.7 Distrib 4.1.9, for pc-linux-gnu (i686)Connection id: 62Current database:Current user: root@localhostSSL: Not in useCurrent pager: stdoutUsing outfile: ”Using delimiter: ;Server version: 5.1.11-beta-logProtocol version: 10Connection: Localhost via UNIX socketServer characterset: latin1Db characterset: latin1Client characterset: latin1Conn. characterset: latin1UNIX socket: /tmp/mysql.sockUptime: 58 min 23 secThreads: 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: 62Current database:Current user: root@localhostSSL: Not in useCurrent pager: stdoutUsing outfile: ”Using delimiter: ;Server version: 5.1.11-beta-logProtocol version: 10Connection: Localhost via UNIX socketServer characterset: latin1Db characterset: utf8Client characterset: utf8Conn. characterset: latin1UNIX socket: /tmp/mysql.sockUptime: 1 hour 6 min 18 secThreads: 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,而且在建数据库的时候我们可以通过这样的指令实现数据库的字符集设置:

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

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

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

CREATE DATABASE `database` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
客户端php程序使用如下方法设定连接所使用的字符集:

PHP程序在查询数据库之前,执行mysql_query(“set names utf8;”);

例子:
<?php
mysql_connect(‘localhost’,'user’,'password’); 2415316
mysql_select_db(‘my_db’);

//请注意,这步很关键,如果没有这步,所有的数据读写都会不正确的
//它的作用是设置本次数据库联接过程中,数据传输的默认字符集
mysql_query(“set names utf8;”);

//必须将gb2312(本地编码)转换成utf-8,也可以使用iconv()函数
mysql_query(mb_convet_encoding(“insert into my_table values(‘测试’);”, “utf-8″, “gb2312″));
?>
如果你想使用gb2312编码,那么建议你使用latin1作为数据表的默认字符集,这样就能直接用中文在命令行工具中插入数据,并且可以直接显示出来.而不要使用gb2312或者gbk等字符集,如果担心查询排序等问题,可以使用binary属性约束,例如:

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

旧数据升级办法

(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

类别数据库 标签
  1. louis vuitton outlet
    发表于 2010年06月18号 12时04分00秒 | 1楼

    WOW!

  2. Mulberry Handbags
    发表于 2010年06月19号 17时54分33秒 | 2楼

    love this. Lovely weekend Hope

  3. mbt chapa
    发表于 2010年06月20号 03时39分58秒 | 3楼

    To say one word: BELIEVE.

  4. star necklace
    发表于 2010年06月21号 13时20分07秒 | 4楼

    I love to recieve this story at this moment in my life.

  5. nfl jerseys Atlanta Falcons
    发表于 2010年06月21号 18时48分23秒 | 5楼

    haha, good luck with the next work, sure it’ll be groundbreaking.

  6. paul smith wallets
    发表于 2010年07月25号 13时00分27秒 | 6楼

    Bless you: Soooo funny!!

  7. discount puma shoes
    发表于 2010年07月28号 16时50分08秒 | 7楼

    Thank you for an inspiring post which has provided me with my motivation today!

  1. 目前没有通告
你必需 登陆 才能发表评论.