`
Zhongwei_leg
  • 浏览: 555242 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

mysql 中 character set 与 collation 的点滴理解

阅读更多

参考 MySQL 保存 emoji 表情失败报错

http://www.sunzhongwei.com/mysql-to-save-error-emoji-face-failure

 

使用 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 下输入:

 

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';

 

会使索引失效。

 

 

参考列表:

0. MySQL 保存 emoji 表情失败报错

http://www.sunzhongwei.com/mysql-to-save-error-emoji-face-failure

 

1. What is the best collation to use for mysql with php.

http://stackoverflow.com/questions/367711/what-is-the-best-collation-to-use-for-mysql-with-php

 

2. Unicode Character Sets

http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html

 

3. Show Collation Syntax

http://dev.mysql.com/doc/refman/5.1/en/show-collation.html

 

4. The Binary Operator

http://dev.mysql.com/doc/refman/5.1/en/charset-binary-op.html

2
0
分享到:
评论

相关推荐

    mysql字符集与比对方法collation

    MySQL字符集与比对方法Collation是数据库设计中的重要概念,尤其在处理多语言或有特殊字符需求的数据时。字符集(Character Set)定义了数据的编码方式,而比对方法(Collation)则规定了字符的排序和比较规则。在...

    解决 docker mysql 中文乱码问题

    docker mysql 字符集设置 ...default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] collation-server=utf8_general_ci character-set-server=utf8 init-connect='SET NAMES utf8' 2. 编写 Dock

    MySQL 编码utf8 与 utf8mb4 utf8mb4_unicode_ci 与 utf8mb4_general_ci

    而在MySQL 8.0中,由于`utf8mb4`已是默认字符集,你可以只设置`[mysqld]`部分的`character-set-server`: ```ini [mysqld] character-set-server = utf8mb4 ``` 同时,为了确保客户端连接也是`utf8mb4`,你还需要在`...

    设置mysql字符集

    字符集(Character Set)定义了数据在存储和处理时所采用的编码标准,而校对集(Collation)则规定了字符集下的排序规则和比较方式。在MySQL中,主要涉及以下几个关键变量: - `character_set_system`:系统默认...

    mysql server5.0(免安装版)

    # set character collation default-collation=gbk_chinese_ci 2). 如果要在中文环境的服务器端使用mysql命令行,改变my.ini文件中mysql的默认字符集。 [mysql] # set character set default-character-set=gbk

    教程:修改mysql字符编码成为UTF8.docx

    这将显示 MySQL 数据库的所有字符编码信息,包括 character_set_client、character_set_connection、character_set_database 等等。 使用 SET 命令修改字符编码 除了修改 my.ini 文件外,我们也可以使用 SET 命令...

    MySQL中文乱码问题解决方案

    在MySQL中,如果表、列或连接客户端与服务器之间的字符集不一致,则可能会导致乱码现象。 #### 二、检查当前使用的字符集和排序规则 首先,需要确认当前MySQL系统正在使用的字符集和排序规则。可以通过执行以下SQL...

    MySQL中文编码设置

    因此,理解并正确配置MySQL中的字符集是每个Java Web开发者必须掌握的基础技能之一。 #### 二、MySQL字符集介绍 MySQL支持多种字符集,其中最常用的包括ASCII(默认字符集)、Latin1、UTF-8等。UTF-8是一种支持多...

    MySql中文编码问题

    首先,我们要明白MySQL的字符集(Character Set)和校对集(Collation)的概念。字符集决定了数据库能够存储哪些字符,而校对集则规定了字符的排序和比较规则。对于中文环境,常见的字符集有GBK和UTF-8,其中GBK主要...

    linux下mysql基本配置及操作

    * 查看 MySQL 的字符编码:mysql&gt; SHOW VARIABLES LIKE 'character_set_%'; * 查看 MySQL 的 collation 信息:mysql&gt; SHOW VARIABLES LIKE 'collation_%'; 如果我们想要更改 MySQL 的字符编码,我们可以使用以下...

    mysql乱码的解决方法

    - 在`[mysql]`部分将`default-character-set=XXX`改为`default-character-set=utf8`。 - 在`[mysqld]`部分将`character_set_server=XXX`改为`character_set_server=utf8`。 3. **修改db.opt文件**: - 找到MySQL...

    Mysql中解决中文无法插入的解决方案

    - 确保客户端连接的字符集也与服务器保持一致,例如在连接MySQL时,使用`SET character_set_client=utf8;`,`SET character_set_results=utf8;`,`SET character_set_connection=utf8;`。 5. **文件导入问题**: ...

    语法教学02 建立与删除数据库, 简单说明Character与Collation的选择

    [MySQL][關聯式資料庫][DB]_語法教學#02__建立與刪除資料庫,_簡單說明Character與Collation的選

    关于MySQL字符集查看与修改

    MySQL的字符集支持主要涉及两个方面:**字符集(Character set)**和**排序方式(Collation)**。字符集定义了如何存储和表示不同的字符,而排序方式则决定了如何比较这些字符。 MySQL对字符集的支持非常细致,可以...

    如何更改MySQL数据库的编码为utf8mb4

    然后通过执行SQL命令`SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%'`来检查设置是否正确。重要的是,系统变量`character_set_client`、`character_set_connection...

    jsp+mysql中文乱码解决方案集合

    在MySQL的配置文件`my.cnf`或`my.ini`中设置字符集为UTF-8是非常关键的一步。通过修改以下部分: ```plaintext [client] default-character-set=utf8 [mysqld] default-character-set=utf8 ``` 这确保了MySQL...

    MySQL数据库 中文设置

    在MySQL数据库中,正确设置中文显示对于处理中文数据至关重要,特别是对于初学者来说,这是一个常见的挑战。本教程将详述如何避免中文乱码问题,确保数据库、表和列能够正常显示中文内容。 首先,我们需要理解MySQL...

    Mysql 中文乱码 最简单的解决办法

    首先,我们需要理解MySQL中的字符集概念。字符集(Character Set)决定了数据库如何存储和处理字符。对于中文字符,常见的字符集有GBK和UTF-8。GBK是针对中文的扩展GBK编码,而UTF-8是多语言通用的Unicode编码,能...

    Mysql中文乱码问题解决方案

    1. **服务器配置问题**:MySQL服务器默认的字符集可能不支持中文,需要在配置文件(`my.cnf`)中修改`character-set-server`为`utf8`或`utf8mb4`。 2. **客户端设置问题**:连接MySQL时,客户端的字符集设置不正确。...

Global site tag (gtag.js) - Google Analytics