Chinaunix首页 | 论坛 | 博客
  • 博客访问: 203154
  • 博文数量: 73
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 750
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-13 18:32
文章分类

全部博文(73)

文章存档

2009年(1)

2008年(72)

我的朋友

分类: Mysql/postgreSQL

2008-03-27 20:46:42


 
1,常规字符集及校对

  假设我们有一个字母表使用了四个字母:‘A’、‘B’、‘a’、‘b’。我们为每个字母赋予一个数值:‘A=0,‘B= 1,‘a= 2,‘b= 3。字母‘A’是一个符号,数字0是‘A’的编码,这四个字母和它们的编码组合在一起是一个字符集
  希望比较两个字符串的值:‘A’和‘B’。比较的最简单的方法是查找编码:‘A’为0,‘B’为1。因为0 小于1,我们可以说‘A’小于‘B’。我们做的仅仅是在我们的字符集上应用了一个 校对规则:对编码进行比较。
 
在实际生活中,大多数字符集有许多字符;在实际生活中,大多数 校对规则有许多个规则。
  MySQL5.1能够做这些事情:

  ·         使用多种字符集来存储字符串

  ·         使用多种校对规则来比较字符串

  ·         在同一台服务器、同一个数据库或甚至在同一个表中使用不同字符集或校对规则来混合字符串

  ·         允许定义任何级别的字符集和校对规则

  MySQL中的字符集及其校对
 
使用SHOW CHARACTER SET语句列出可用的字符集。任何一个给定的字符集至少有一个校对规则。它可能有几个校对规则。
 
  要想列出一个字符集的校对规则,使用SHOW COLLATION语句。例如,要想查看latin1(“西欧ISO-8859-1)字符集的 校对规则,使用下面的语句查找那些名字以latin1开头的字符集的校对规则:
  mysql> show collation like 'latin1%';
 
  校对规则一般有这些特征:

  ·         两个不同的字符集不能有相同的校对规则。

  ·         每个字符集有一个默认校对规则。例如,latin1默认校对规则是latin1_swedish_ci

  ·         存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束。

  MySQL服务器字符集和校对

  MySQL按照如下方法确定服务器字符集和服务器校对规则: 

  ·         当服务器启动时根据有效的选项设置

  ·         根据运行时的设定值

  当前的服务器字符集和校对规则可以用作character_set_servercollation_server系统变量的值。在运行时能够改变这些变量的值。

  启动服务器时字符集的设定:
  服务器级别,确定方法很简单。当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和 校对规则。可以使用--default-character-set设置字符集,并且可以在字符集后面为 校对规则添加--default-collation。如果没有指定一个字符集,那就与--default-character-set=latin1相同。如果你仅指定了一个字符集(例如,latin1),但是没有指定一个 校对规则,那就与--default-charset=latin1 --default-collation=latin1_swedish_ci相同,因为latin1_swedish_ci是latin1的默认校对规则。因此,以下三个命令有相同的效果:
shell>mysqld
shell>mysqld --default-character-set=latin1
shell>mysqld --default-character-set=latin1\
  --default-collation=latin1_swedish_ci
      

  数据库字符集和校对

 
每一个数据库有一个数据库字符集和一个数据库校对规则,它不能够为空。CREATE DATABASEALTER DATABASE语句有一个可选的子句来指定数据库字符集和校对规则:
  create/alter database db_name
    [default] character set charset_name
    [default] collate collation_name
  eg:
  create database db_name
    default character set latin1 collate latin1_swedish_ci;
  MySQL这样选择数据库字符集和数据库校对规则:

·         如果指定了CHARACTER SET XCOLLATE Y,那么采用字符集X和校对规则Y

·         如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET XCHARACTER SET X的默认校对规则。

·         否则,采用服务器字符集和服务器校对规则。

  默认数据库的字符集和校对规则可以用作character_set_databasecollation_database系统变量。如果没有 默认数据库,这两个变量与相应的服务器级别的变量(character_set_servercollation_server)具有相同的值。

  表字符集和校对 

  每一个表有一个表字符集和一个校对规则,它不能为空。为指定表字符集和校对规则,CREATE TABLE ALTER TABLE语句有一个可选的子句:

  CREATE/alter TABLE tbl_name (column_list)
    [DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
eg:
create table t1(...)
default character set latin1 collate latin1_danish_ci;

MySQL按照下面的方式选择表字符集和 校对规则:

   ·         如果指定了CHARACTER SET XCOLLATE Y,那么采用CHARACTER SET XCOLLATE Y

   ·         如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET XCHARACTER SET X的默认校对规则。

   ·         否则,采用服务器字符集和服务器校对规则。

   如果在列定义中没有指定列字符集和校对规则,则默认使用表字符集和校对规则。

  列字符集和校对
每一个“字符”列(即,CHARVARCHARTEXT类型的列)有一个列字符集和一个列
校对规则,它不能为空。列定义语法有一个可选子句来指定列字符集和校对规则:
create table table1(
column1 varchar(5) character set latin1 collate latin1_german1_ci
);

  MySQL按照下面的方式选择列字符集和校对规则:

·         如果指定了CHARACTER SET XCOLLATE Y,那么采用CHARACTER SET XCOLLATE Y

·         如果指定了CHARACTER SET X而没有指定COLLATE Y,那么采用CHARACTER SET XCHARACTER SET X的默认校对规则。

·         否则,采用表字符集和服务器校对规则。

 

示例1:表和列定义

  create table t1(c1 char(19) character set latin1 collate latin1_german1_ci)
default character set latin2 collate latin2_bin;

示例2:
  create table t1(
    c1 char(10) character set latin1
  )default character set latin1 collate latin1_danish_ci;

  这次我们有一个列使用latin1字符集和一个默认校对规则。尽管它显得自然,默认校对规则却不是表级。相反,因为latin1的默认校对规则总是latin1_swedish_ci,列c1有一个校对规则latin1_swedish_ci(而不是latin1_danish_ci)。

  示例3:表和列定义

  create table t1(c1 char(10))default character set latin1 collate latin1_danish_ci;

  我们有一个列使用一个默认字符集和一个默认校对规则。在这种情况下,MySQL查找表级别来确定列字符集和 校对规则。因此,列c1的字符集是latin1,它的 校对规则是latin1_danish_ci

  10.3.6





















阅读(1160) | 评论(0) | 转发(0) |
0

上一篇: Mysql之旅 一(续)

下一篇:RTTI

给主人留下些什么吧!~~