mysql 中 character set 与 collation

使用 mysql 创建数据表的时候, 总免不了要涉及到 character set 和 collation 的概念, 之前不是很了解。

这两天不是很忙, 就自己整理了一下。

先来看看 character set 和 collation 的是什么?

&. character set, 即字符集。

我们常看到的 utf-8, GB2312, GB18030 都是相互独立的 character set. 即对 Unicode 的一套编码。

那么如何理解 unicode 与 utf-8, GB2312 的区别呢?

打个比方,你眼前有一个苹果,在英文里称之为 apple, 而在中文里称之为苹果。

苹果这个实体的概念就是 unicode , 而 utf-8, GB2312 可以认为就是不同语言对苹果的不同称谓,本质上都是在描述苹果这个物。

&. collation, 即比对方法。

用于指定数据集如何排序,以及字符串的比对规则。(这样说可能比较抽象,后面会详细解释。)

character set 与 collation 的关系

软件国际化是大势所趋, 所以 unicode 是国际化最佳的选择。当然为了提高性能,有些情况下还是使用 latin1 比较好。

mysql 有两个支持 unicode 的 character set:

1. ucs2: 使用 16 bits 来表示一个 unicode 字符。

2. utf8: 使用 1~3 bytes 来表示一个 unicode 字符。

选择哪个 character set 视情况而定,例如 utf8 表示 latin 字符只需要一个字节,所以当用户数据大部分为英文等拉丁字符时,使用 utf8 比较节省数据库的存储空间。据说 SQL Server 采用的是 ucs2, 我表示怀疑。

每个 character set 会对应一定数量的 collation. 查看方法是在 mysql 的 console 下输入:

Java代码  

  1. mysql> show collation;

我们会看到这样的结果:

collation 名字的规则可以归纳为这两类:

1. <character set>_<language/other>_<ci/cs>

2. <character set>_bin

例如:

utf8_danish_ci

ci 是 case insensitive 的缩写, cs 是 case sensitive 的缩写。即,指定大小写是否敏感。

奇怪的是 utf8 字符集对应的 collation 居然没有一个是 cs 的。

那么 utf8_general_ci, utf8_unicode_ci, utf8_danish_ci 有什么区别? 他们各自存在的意义又是什么?

同一个 character set 的不同 collation 的区别在于排序、字符春对比的准确度(相同两个字符在不同国家的语言中的排序规则可能是不同的)以及性能。

例如:

utf8_general_ci 在排序的准确度上要逊于 utf8_unicode_ci, 当然,对于英语用户应该没有什么区别。但性能上(排序以及比对速度)要略优于 utf8_unicode_ci. 例如前者没有对德语中

? = ss

的支持。

而 utf8_danish_ci 相比 utf8_unicode_ci 增加了对丹麦语的特殊排序支持。

补充:

1. 当表的 character set 是 latin1 时,若字段类型为 nvarchar, 则字段的字符集自动变为 utf8.

可见 database character set, table character set, field character set 可逐级覆盖。

2. 在 ci 的 collation 下,如何在比对时区分大小写:

写道

mysql> select * from pet;

+----------+-------+---------+------+------------+-------+

| name | owner | species | sex | birth | death |

+----------+-------+---------+------+------------+-------+

| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |

| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |

+----------+-------+---------+------+------------+-------+

2 rows in set (0.00 sec)

mysql> select * from pet where name = ‘whistler‘;

+----------+-------+---------+------+------------+-------+

| name | owner | species | sex | birth | death |

+----------+-------+---------+------+------------+-------+

| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |

| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |

+----------+-------+---------+------+------------+-------+

2 rows in set (0.00 sec)

mysql> select * from pet where binary name = ‘whistler‘;

+----------+-------+---------+------+------------+-------+

| name | owner | species | sex | birth | death |

+----------+-------+---------+------+------------+-------+

| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |

+----------+-------+---------+------+------------+-------+

1 row in set (0.00 sec)

mysql> select * from pet where name = binary ‘whistler‘;

+----------+-------+---------+------+------------+-------+

| name | owner | species | sex | birth | death |

+----------+-------+---------+------+------------+-------+

| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |

+----------+-------+---------+------+------------+-------+

1 row in set (0.00 sec)

推荐使用

mysql> select * from pet where name = binary ‘whistler‘;

这样可以保证当前字段的索引依然有效, 而

mysql> select * from pet where binary name = ‘whistler‘;

会使索引失效。

-----------------------------------------------------------------------------------------------------------

charset 和 collation 有多个级别的设置:服务器级、数据库级、表级、列级和连接级

www.2cto.com

1.服务器级

查看设置:show global variables like ‘character_set_server‘; 和 show global variables like ‘collation_server‘;

修改设置:在OPTION FILE (/etc/mysql/my.cnf)里设置:

[mysqld]

character_set_server=utf8

collation_server=utf8_general_ci

2. 数据库级

查看设置:select * from information_schema.schemata where schema_name = ‘cookbook‘;

设置:

1.若没有显式设置,则自动使用服务器级的配置

2.显式设置:在创建库时指定

create database playUtf8  DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;

www.2cto.com

3.表级

查看设置:show create table course;

设置:

1.若没有显式设置,则自动使用数据库级的配置

2.显式设置:在创建表时指定

create table utf ( id int ) default charset=utf8 default collate=utf8_bin;

4.列级

查看设置:show create table course;

设置:

1.若没有显式设置,则自动使用表级的配置

2.显式设置:

CREATE TABLE Table1(column1 VARCHAR(5) CHARACTER SET latin1 COLLATE latin1_german1_ci);

5.连接级别

查看设置:

show variables like ‘character_set_client‘;  # 服务端使用这个编码来理解客户端发来的statements

show variables like ‘character_set_connection‘ ; # 我还不知道什么意思,等看了mysql源码再说

show variables like ‘character_set_results‘; # 服务端使用这个编码回送结果集和错误信息

设置:

客户端在连接时可以指定这些参数;同时,服务端也提供了一个Global范围的值,客户端未指定这些参数时,服务端就使用这个Global值。这个global值怎么设置的? 我查遍了很多文档,似乎还没看到设置的办法 (有人说通过my.cnf,或者在启动mysqld时指定命令行参数,其实都是错的)

附:connector/j传输SQL时用什么编码?

答案: "The character encoding between client and server is automatically detected upon connection. The encoding used by the driver is specified on the server using the character_set_server system variable for server versions 4.1.0 and newer."

也就是说,是在连接时查询服务器端的character_set_server值,再确定连接将使用的编码。

不过,官方文档还说,"要想覆盖客户端上的自动检测编码功能,可在用于连接到服务器的URL中使用“characterEncoding”属性。"

时间: 2024-10-11 01:09:19

mysql 中 character set 与 collation的相关文章

MySQL中character set与collation的理解(转)

character set和collation的是什么? character set即字符集 我们常看到的UTF-8.GB2312.GB18030都是相互独立的character set.即对Unicode的一套编码. 那么如何理解Unicode与UTF-8.GB2312的区别呢? 打个比方,你眼前有一个苹果,在英文里称之为apple,而在中文里称之为苹果. 苹果这个实体的概念就是Unicode,而UTF-8,GB2312可以认为就是不同语言对苹果的不同称谓,本质上都是在描述苹果这个物. col

mysql中变量赋值

http://www.cnblogs.com/qixuejia/archive/2010/12/21/1913203.html sql server中变量要先申明后赋值: 局部变量用一个@标识,全局变量用两个@(常用的全局变量一般都是已经定义好的): 申明局部变量语法:declare @变量名 数据类型:例如:declare @num int: 赋值:有两种方法式(@num为变量名,value为值) set @num=value;   或   select @num=value; 如果想获取查询

查询MySQL中某个数据库中有多少张表

SELECT COUNT(*) TABLES, table_schema FROM information_schema.TABLES   WHERE table_schema = '数据库' GROUP BY table_schema; 这还是头一次接触information_schema这个数据库, information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等.有些时候用于表

MySQL中information_schema 数据库 是干什么的

MySQL中information_schema是什么 大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个information_schema数据库. information_schema数据库是做什么用的呢,使用WordPress博客的朋友可能会想,是不是安装模板添加的数据库呀?看完本片文章 后,你就会对information_schema数据库有所了解. information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数据是

MySQL中information_schema是什么

MySQL中information_schema是什么 大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个information_schema数据库. information_schema数据库是做什么用的呢,使用WordPress博客的朋友可能会想,是不是安装模板添加的数据库呀?看完本片文章 后,你就会对information_schema数据库有所了解. information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数据是

MySQL中information_schema数据库是干啥的

大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个 information_schema数据库.information_schema数据库是做什么用的呢,使用WordPress博客的朋友可能会想,是不是安装模板添加的数据库呀?看完本片文章后,你就会对information_schema数据库有所了解. information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限

MYSQL中的COLLATE是什么?

本文由horstxu发表 在mysql中执行show create table <tablename>指令,可以看到一张表的建表语句,example如下: CREATE TABLE `table1` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1', `field2` varchar(128) COLLATE utf8_

MYSQL中information_schema简介

一.information_schema简介 在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库.其中保存着关于MySQL服务器所维护的所有其他数据库的信息.如数据库名,数据库的表,表栏的数据类型与访问权 限等.在INFORMATION_SCHEMA中,有数个只读表.它们实际上是视图,而不是基本表,因此,你将无法看到与之相关的任何文件. information_schema数据库表说明: SCHEMATA表:提供了当前mysql实例中所有数据库的信息.

【个人笔记】《知了堂》MySQL中的数据类型

MySQL中的数据类型 1.整型 MySQL数据类型 含义(有符号) tinyint(m) 1个字节  范围(-128~127) smallint(m) 2个字节  范围(-32768~32767) mediumint(m) 3个字节  范围(-8388608~8388607) int(m) 4个字节  范围(-2147483648~2147483647) bigint(m) 8个字节  范围(+-9.22*10的18次方) 取值范围如果加了unsigned,则最大值翻倍,如tinyint un