MySQL字符集和校对规则

来源:互联网 发布:淘宝数据魔方破解 编辑:程序博客网 时间:2024/05/16 18:42

列出可用的字符集
show character set;
显示校对规则
show collation ;
show collation like '%gbk%';
+----------------+---------+----+---------+----------+---------+
| Collation      | Charset | Id | Default | Compiled | Sortlen |
+----------------+---------+----+---------+----------+---------+
| gbk_chinese_ci | gbk     | 28 | Yes     | Yes      |       1 |
| gbk_bin        | gbk     | 87 |         | Yes      |       1 |
+----------------+---------+----+---------+----------+---------+
2 rows in set (0.00 sec)


gbk_chinese_ci是默认校对规则



本文对MySQL支持的常规字符集和校对规则作了一个简单的说明,并介绍了MySQL常用字符集变量的含义和设置,字符集变量的不恰当设置有可能导致包括乱码在内的诸多问题。

  • 常规字符集和校对

字符集是一套符号和编码。校对规则是在字符集内用于比较字符的一套规则。MySQL服务器能够支持多种字符集,可以使用SHOW CHARACTER SET语句列出可用的字符集。任何一个给定的字符集至少有一个校对规则,它也可能存在几个校对规则。

如果希望列出一个字符集的校对规则,可以使用SHOW COLLATION语句。例如,如果希望查询以latin1开头的校对规则,可以使用如下语句SHOW COLLATION LIKE 'latin1%'。

校对规则一般有如下特征:

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

字符集和校对规则有四个级别的默认设置:服务器级、数据库级、表级和连接级。

MySQL数据库有一个服务器字符集和一个服务器校对规则,它们均不能为空。在服务器级别,当启动mysqld时,根据使用的初始选项设置来确定服务器字符集和校对规则。可以使用—default-character-set设置字符集,并且可以在字符集后面添加校对规则:--default-collation。

每一个数据库有一个数据库字符集和一个数据库校对规则,它不能够为空。CREATE DATABASE和ALTER DATABASE语句有一个可选的子句来指定数据库字符集和校对规则:

CREATE DATABASE db_name
    [[DEFAULT] CHARACTER SET charset_name]
    [[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name
    [[DEFAULT] CHARACTER SET charset_name]
    [[DEFAULT] COLLATE collation_name]

默认数据库的字符集和校对规则可以用作character_set_database和collation_database系统变量。无论何时默认数据库更改了,服务器将设置这两个变量的值。如果没有默认数据库,这两个变量与相应的服务器级别的变量(character_set_server和collation_server)具有相同的值。

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

CREATE TABLE tbl_name (column_list)
    [DEFAULT CHARACTER SET charset_name [COLLATE collation_name]]
ALTER TABLE tbl_name
    [DEFAULT CHARACTER SET charset_name] [COLLATE collation_name]

 

每一个“字符列”(即CHAR、VARCHAR或TEXT类型的列)有一个列字符集和一个列校对规则,它不能为空。可以通过如下方式来指定列字符集和列校对规则:

col_name {CHAR | VARCHAR | TEXT} (col_length)
    [CHARACTER SET charset_name [COLLATE collation_name]]
  • 客户端和服务器交互字符集和校对规则

一些字符集和校对规则系统变量与客户端和服务器的交互有关。

  • 服务器字符集和校对规则可以用作character_set_server和collation_server变量的值;
  • 默认数据库的字符集和校对规则可用作character_set_database和collation_database变量的值。

在客户端和服务器的连接处理中也涉及了字符集和校对规则变量。每一个客户端有一个连接相关的字符集和校对规则变量。

  • 当查询离开客户端后,在查询中使用哪种字符集:服务器使用character_set_client变量作为客户端发送的查询中使用的字符集;
  • 服务器接收到查询后应该转换为哪种字符集:转换时,服务器使用character_set_connection和collation_connection系统变量。它将客户端发送的查询从character_set_client系统变量转换到character_set_connection;
  • 服务器发送结果集或者返回错误信息到客户端之前应该转换为哪种字符集:character_set_results变量指示服务器返回查询结果到客户端使用的字符集。包括结果数据,例如列值和结果元数据。

有两个语句影响连接字符集:

  • SET NAMES ‘character_name’;
  • SET CHARACTER_SET charset_name。

其中,SET NAMES ‘x’语句与如下三个语句等价:

  • SET character_set_client = x;
  •  SET character_set_results = x;
  • SET character_set_connection = x。

注:如果希望查看上这些与字符有关的变量的值可以通过如下语句:SHOW VARIABLES LIKE 'character%';

对于mysql客户端,如果你希望使用与默认字符集不同的字符集,不需要每次启动时执行SET NAMES语句以在mysql语句行中或者选项文件中添加一个—default-character-set选项设置。如下:

[mysql]

default-character-set=koi8r

如果不希望服务器执行任何转换,设置character_set_results为NULL。

  • 字符串字符文字字符集和校对规则

每一个字符串字符文字有一个字符集和一个校对规则,它不能为空。一个字符串文字可能有一个可选的字符集引介词和COLLATE子句。如下所示:

[_charset_name]'string' [COLLATE collation_name]

 

  • BINARY操作符:

BINARY操作符是COLLATE子句的一个速记符。BINARY  ‘x’等价于’x’ COLLATE y,这里y是字符集'x'二元 校对规则的名字。每一个字符集有一个二元校对规则。

  • Unicode支持:

MySQL 5.1支持两种字符集以保存Unicode数据:

  • ucs2,UCS-2 Unicode字符集;
  • utf8,Unicode字符集的UTF8编码。

在UCS-2(二进制Unicode表示法)中,每一个字符用一个双字节的Unicode编码来表示的,第一个字节表示重要的意义。UTF8字符集(转换Unicode表示)是存储Unicode数据的一种可选方法。它根据 RFC 3629执行。UTF8字符集的思想是不同Unicode字符采用变长字节序列编码。

以上内容多来源于MySQL参考手册,如果需要更详细的信息,请查看MySQL参考手册。


0 0
原创粉丝点击