Chinaunix首页 | 论坛 | 博客
  • 博客访问: 380126
  • 博文数量: 120
  • 博客积分: 5051
  • 博客等级: 大校
  • 技术积分: 1255
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-03 01:25
文章分类

全部博文(120)

文章存档

2011年(2)

2010年(11)

2009年(28)

2008年(26)

2007年(53)

我的朋友

分类: LINUX

2007-12-12 19:45:56

大家在开发设计数据库的过程当中,可能常常被字符集引起的一些问题而困惑,比如字符集设置不当,可能会引起乱码,或者造成查询速度变慢的情况。本文就此对mysql数据库所采用的字符集进行分类。 但是通过仔细分析,发现:在字符集设置正确的情况下,字符集之间的差异对查询速度并没有太大的影响。至于哪一种字符集是数据库的最佳选择,必须根据具体的实际应用来决定。

mysql字符集归类

一、相关概念:

1.字符集是一套符号和编码
假设有一个字母表使用了四个字母:‘A’、‘B’、‘a’、‘b’。我们为每个字母赋予一个数值:‘A’=0,‘B’= 1,‘a’= 2,
‘b’= 3。字母‘A’是一个符号,数字0是‘A’的编码,这四个字母和它们的编码组合在一起是一个字符集。
2.校对规则是在字符集内用于比较字符的一套规则
比较两个字符串的值:‘A’和‘B’。比较的最简单的方法是查找编码:‘A’为0,‘B’为1。因为0 < 1,我们可以说‘A’小于‘B’。

二、字符集和校对规则的作用

1.字符集的作用:存储char、varchar、text字符串
mysql支持30多种字符集,支持70多种校验规则。在mysql数据库里,多种字符集可以混合使用。
查看字符集命令 mysql> SHOW CHARACTER SET;
2.校验规则的作用:比较字符串
任何一个字符集至少有一个校对规则。例如,要想查看latin1字符集的校对规则:mysql> SHOW COLLATION LIKE 'latin1%';

三、mysql字符集的分类

mysql字符集分为三类:
1.数据存储在数据库里所用的字符集
2.客户端程序与mysql服务器交互所采用的字符集
3.其他字符集

1.数据存储在数据库里所用的字符集
这个类别的字符集和校对规则有4个级别的设置,它们均不能设置为空:
1) 服务器级
对应的系统变量:character_set_server、 collation_server
设置方法:
a.启动mysqld时,用--default-character-set=‘charset_name’ --default-collation='collation_name’指定
b.在/etc/my.cnf里
[mysqld]
default-character-set=‘charset_name’
default-collation='collation_name’
2) 数据库级
对应的系统变量:character_set_database、 collation_database
设置方法:
a.创建、修改数据库时指定
例如:
CREATE DATABASE db_name
DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
b.修改系统变量character_set_database、 collation_database
c.若未指定数据库级的字符集,则默认继承服务器级的设置
3) 表级
对应的系统变量:无
设置方法:
a.创建或者修改表时指定:
例如:
CREATE TABLE t1 ( ... )
DEFAULT CHARACTER SET latin1 COLLATE latin1_danish_ci;

修改时指定:

ALTER TABLE products DEFAULT CHARSET utf8

b.若不指定,则继承数据库级别设置
4) 列级
对应的系统变量:无
设置方法:
a.创建、修改时指定
例如:
CREATE TABLE Table1
(
column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci
);


修改时指定:

ALTER TABLE products CHANGE products_model products_model VARCHAR( 20 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL 


b.若不指定,则默认继承表级别设置

2. 客户端程序与mysql服务器交互所采用的字符集
与服务器交互过程中涉及的字符集,可以设置为null,即表示连接过程中,不需要转换字符集
对应的系统变量:
character_set_client ------指示客户端发送的查询中使用的字符集
character_set_connection ----服务器接收到查询后,将从character_set_client转换到character_set_connection
character_set_results ----指示服务器返回查询结果到客户端使用的字符集

设置方法:
a.mysql> SET NAMES 'charset_name'

(备注:SET NAMES 'x'语句与以下三个语句等价:
mysql> SET character_set_client = x;
mysql> SET character_set_connection = x;
mysql> SET character_set_results = x;)
b.在my.cnf里
[mysql] ---注意这里是[mysql],而不是[mysqld]。
default-character-set=utf8

3.其他字符集
show variables看到的与字符集相关参数变量,一般不太常设置,采用默认即可
参数变量:
1) character_set_system
元数据存储所用的字符集,为了支持全世界其他国家的语言,默认为utf8
因为utf8支持所有国家的语言,便于各个国家可以使用自己的语言开发数据库
2) character_set_filesystem
跟文件名有关的参数,支持文件名的转换,默认为binary

阅读(1526) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~