MySQL中数据库的默认字符集和校对规则都有哪些?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL中数据库的默认字符集和校对规则都有哪些?相关的知识,希望对你有一定的参考价值。

1. ASCII
用途:用来映射简单的单字节字符,比如大小写英文字母、阿拉伯数字、常用的标点符、运算符、控制字符等。
编码范围:U+0000 - U+007F
注意:对于用这类字符的场景够用了,但是却无法表达比如汉字,日文等编码。
2. UNICODE
用途:用来映射包含 ASCII 以内的其他的所有字符。
编码范围:U+0000 - U+10FFFF
注意:ASCII 是 UNICODE 的子集,ASCII 编码的字符可以无损转换为 UNICODE 编码的字符。

mysql 常用字符集

1. Latin1
Latin1 是 cp1252 或者 ISO-8859-1 的别名。ISO-8859-1 编码是单字节编码,向下兼容 ASCII。
编码范围:U+0000 - U+00FF

ISO-8859-1 收录的字符除 ASCII 收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。
单字节内的空间都被 ISO-8859-1 编码占用,所以能够用 ISO-8859-1 编码存储、传输其他任何编码的字节流。
比如把一个 Utf8mb4 的编码或者 GBK 的编码存入 Latin1,不会有任何问题。因为 Latin1 保留了原始的字节流,这也就是 MySQL 长期以来把 Latin1 做默认字符集的原因。
但是由于 Latin1 对任何字符都存放字节流,造成了字符个数的浪费。
比如:
CHAR(10) CHARACTER SET LATIN1;CHAR(10) CHARACTER SET UTF8;

该字段中存储字符个数 UTF8 是 Latin1 的三倍!!!
2. GB18030
GB18030 是中国官方标准字符集,向前兼容 GBK、GB2312,是这两个的超集。用 1、2、4 个字节分别表示一个符号。比如对一般中文字符,默认是用两个字节编码存储。Windows 系统,默认用的就是 GB18030。
若只是存储中文字符,那 GB18030 最佳。
原因有两点:
1)占用空间小,比如比 UTF8 小。
2)存储的汉字根据拼音来排序,检索快。
3. UTF8
UTF8 是 Unicode 的编码实现,可以存储 UNICODE 编码对应的任何字符, 这也是使用最多的一种编码。最大的特点就是变长的编码方式,用 1 到 4 个字节表示一个符号,可以根据不同的符号编码字节长度。
字母或数字用 1 字节,汉字用 3 字节,emoji 表情符号用 4 字节。UTF8 字符集目前是使用最广泛的。
注意!MySQL 里常说的 UTF8 是 UTF8MB3 的别名,UTF8MB3 是 UTF8MB4 的子集,UTF8MB4 才是真正的 4 字节 UTF8 字符集!
UTF8MB3 表示最大支持 3 个字节存储字符,UTF8MB4 表示最大 4 个字节存储字符。根据实际需要和未来展望,MySQL 8.0 已经默认用 UTF8MB4 基础字符集。
参考技术A 灰常多,请耐心查看。

字符集Start-----------------------
Charset Description Default collation
big5 Big5 Traditional Chinese big5_chinese_ci
dec8 DEC West European dec8_swedish_ci
cp850 DOS West European cp850_general_ci
hp8 HP West European hp8_english_ci
koi8r KOI8-R Relcom Russian koi8r_general_ci
latin1 cp1252 West European latin1_swedish_ci
latin2 ISO 8859-2 Central European latin2_general_ci
swe7 7bit Swedish swe7_swedish_ci
ascii US ASCII ascii_general_ci
ujis EUC-JP Japanese ujis_japanese_ci
sjis Shift-JIS Japanese sjis_japanese_ci
hebrew ISO 8859-8 Hebrew hebrew_general_ci
tis620 TIS620 Thai tis620_thai_ci
euckr EUC-KR Korean euckr_korean_ci
koi8u KOI8-U Ukrainian koi8u_general_ci
gb2312 GB2312 Simplified Chinese gb2312_chinese_ci
greek ISO 8859-7 Greek greek_general_ci
cp1250 Windows Central European cp1250_general_ci
gbk GBK Simplified Chinese gbk_chinese_ci
latin5 ISO 8859-9 Turkish latin5_turkish_ci
armscii8 ARMSCII-8 Armenian armscii8_general_ci
utf8 UTF-8 Unicode utf8_general_ci
ucs2 UCS-2 Unicode ucs2_general_ci
cp866 DOS Russian cp866_general_ci
keybcs2 DOS Kamenicky Czech-Slovak keybcs2_general_ci
macce Mac Central European macce_general_ci
macroman Mac West European macroman_general_ci
cp852 DOS Central European cp852_general_ci
latin7 ISO 8859-13 Baltic latin7_general_ci
cp1251 Windows Cyrillic cp1251_general_ci
cp1256 Windows Arabic cp1256_general_ci
cp1257 Windows Baltic cp1257_general_ci
binary Binary pseudo charset binary
geostd8 GEOSTD8 Georgian geostd8_general_ci
cp932 SJIS for Windows Japanese cp932_japanese_ci
eucjpms UJIS for Windows Japanese eucjpms_japanese_ci
字符集End-----------------------
字符集--校验 关系Start------------------
Collation Charset Default
big5_chinese_ci big5 Yes
big5_bin big5
dec8_swedish_ci dec8 Yes
dec8_bin dec8
cp850_general_ci cp850 Yes
cp850_bin cp850
hp8_english_ci hp8 Yes
hp8_bin hp8
koi8r_general_ci koi8r Yes
koi8r_bin koi8r
latin1_german1_ci latin1
latin1_swedish_ci latin1 Yes
latin1_danish_ci latin1
latin1_german2_ci latin1
latin1_bin latin1
latin1_general_ci latin1
latin1_general_cs latin1
latin1_spanish_ci latin1
latin2_czech_cs latin2
latin2_general_ci latin2 Yes
latin2_hungarian_ci latin2
latin2_croatian_ci latin2
latin2_bin latin2
swe7_swedish_ci swe7 Yes
swe7_bin swe7
ascii_general_ci ascii Yes
ascii_bin ascii
ujis_japanese_ci ujis Yes
ujis_bin ujis
sjis_japanese_ci sjis Yes
sjis_bin sjis
hebrew_general_ci hebrew Yes
hebrew_bin hebrew
tis620_thai_ci tis620 Yes
tis620_bin tis620
euckr_korean_ci euckr Yes
euckr_bin euckr
koi8u_general_ci koi8u Yes
koi8u_bin koi8u
gb2312_chinese_ci gb2312 Yes
gb2312_bin gb2312
greek_general_ci greek Yes
greek_bin greek
cp1250_general_ci cp1250 Yes
cp1250_czech_cs cp1250
cp1250_croatian_ci cp1250
cp1250_bin cp1250
cp1250_polish_ci cp1250
gbk_chinese_ci gbk Yes
gbk_bin gbk
latin5_turkish_ci latin5 Yes
latin5_bin latin5
armscii8_general_ci armscii8 Yes
armscii8_bin armscii8
utf8_general_ci utf8 Yes
utf8_bin utf8
utf8_unicode_ci utf8
utf8_icelandic_ci utf8
utf8_latvian_ci utf8
utf8_romanian_ci utf8
utf8_slovenian_ci utf8
utf8_polish_ci utf8
utf8_estonian_ci utf8
utf8_spanish_ci utf8
utf8_swedish_ci utf8
utf8_turkish_ci utf8
utf8_czech_ci utf8
utf8_danish_ci utf8
utf8_lithuanian_ci utf8
utf8_slovak_ci utf8
utf8_spanish2_ci utf8
utf8_roman_ci utf8
utf8_persian_ci utf8
utf8_esperanto_ci utf8
utf8_hungarian_ci utf8
ucs2_general_ci ucs2 Yes
ucs2_bin ucs2
ucs2_unicode_ci ucs2
ucs2_icelandic_ci ucs2
ucs2_latvian_ci ucs2
ucs2_romanian_ci ucs2
ucs2_slovenian_ci ucs2
ucs2_polish_ci ucs2
ucs2_estonian_ci ucs2
ucs2_spanish_ci ucs2
ucs2_swedish_ci ucs2
ucs2_turkish_ci ucs2
ucs2_czech_ci ucs2
ucs2_danish_ci ucs2
ucs2_lithuanian_ci ucs2
ucs2_slovak_ci ucs2
ucs2_spanish2_ci ucs2
ucs2_roman_ci ucs2
ucs2_persian_ci ucs2
ucs2_esperanto_ci ucs2
ucs2_hungarian_ci ucs2
cp866_general_ci cp866 Yes
cp866_bin cp866
keybcs2_general_ci keybcs2 Yes
keybcs2_bin keybcs2
macce_general_ci macce Yes
macce_bin macce
macroman_general_ci macroman Yes
macroman_bin macroman
cp852_general_ci cp852 Yes
cp852_bin cp852
latin7_estonian_cs latin7
latin7_general_ci latin7 Yes
latin7_general_cs latin7
latin7_bin latin7
cp1251_bulgarian_ci cp1251
cp1251_ukrainian_ci cp1251
cp1251_bin cp1251
cp1251_general_ci cp1251 Yes
cp1251_general_cs cp1251
cp1256_general_ci cp1256 Yes
cp1256_bin cp1256
cp1257_lithuanian_ci cp1257
cp1257_bin cp1257
cp1257_general_ci cp1257 Yes
binary binary Yes
geostd8_general_ci geostd8 Yes
geostd8_bin geostd8
cp932_japanese_ci cp932 Yes
cp932_bin cp932
eucjpms_japanese_ci eucjpms Yes
eucjpms_bin eucjpms
字符集--校验 关系END------------------
========================
如果你可以访问MYSQL的话。教你两个语句。直接查出来看。格式比这个好看。
SHOW CHARACTER SET
SHOW COLLATION

如果需要。我有电子表格。
给我发邮件索要。liuhuanaiaiai@163.com。
Over!本回答被提问者采纳

mysql字符集与校对规则---大小写敏感那点事

    在关系型数据库中,oracle/sql_server/db2都有对数据进行区分大小写,不过mysql有点奇怪,对数据不区分大小写,详细情况请看下面解析.

    MySQL在Linux下数据库名、表名、列名、别名大小写的默认规则是这样的:

        1.数据库名与表名是严格区分大小写的.

        2.表的别名是严格区分大小写的.

        3.列名与列的别名在所有的情况下均是忽略大小写的.

        4.字段内容(即数据)默认情况下是大小写不敏感的.

        5.变量名(函数和存储过程)也是严格区分大小写的.

    所以不禁我们就会想去修改,而控制这些的究竟又是什么呢?正是字符集和字符集的校对规则限制的.


字符集和校对规则是什么

    字符集是我们字符解析的编码表,在计算机底层里,任何字符都只是无法直接解析的代码,需要这些编码表来解析究竟是什么字.最基础的正是ASCII码表,但是这个表字符太少,用来代表英文和一些日常标点符号就还好,但是要来代表全世界那么多的文字,就显然不够用了,所以就出了各种字符集来解析各种文字,例如中文简体的gb2312,中文繁体的big5,最出名的万国码utf8,还有支持emoji表情的utf8mb4等.

    我们常说的访问乱码,正是由于字符编码不对称导致的,可能是你和服务器之间,也可能是服务器与数据库之间,也可能是代码内部之间没有转换,等等.

    字符集是通用的,存在于计算机世界的各种环境,数据库只是其中之一,而校对规则,是针对mysql来说的,规则也都是固定的.可能有人会觉得懵逼,有了字符集,为什么还要校对规则,通俗易懂点说,字符之间有差异,但是靠什么去体现差异呢(例如排序和分组的操作),那就是这个校对规则的存在意义.例如:不区分大小写的话,A和a是同样意义的,而校对规则严格之后,区分了大小写,A和a就不一样了.


字符集

    我们可以用下面的命令来看看支持哪些字符集和校对规则.

#查看支持哪些字符集,节选
mysql> show character set;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.01 sec)

    一般来说,mysql默认还是支持较多字符集,然而大部分情况我们还是用utf8比较多一些.原因是看到最后一列Maxlen中,代表的是使用这种字符集后的一个字符占用的最大字节数.big5(中文繁体)和gb2312(中文简体)虽然占的少,只有2字节,但是通用性不佳,utf16虽然很强大,但是占的字节数略多,占用了4字节,况且也不见得用得了那么多,折衷之下还是utf8好用一些,一个字符占用3字节.

    更改mysql的默认字符集,可以在配置文件my.cnf里添加

#要在[mysqld]子项添加
[mysqld]
#全局默认字符集类型,按需求设定
character-set-server = utf8
#改完之后重启,进入mysql看一下,(不重启也行,一个个慢慢改吧)
mysql> show variables like ‘character%‘;
+--------------------------+---------------------------------------------------------------+
| Variable_name            | Value                                                         |
+--------------------------+---------------------------------------------------------------+
| character_set_client     | utf8                                                          |
| character_set_connection | utf8                                                          |
| character_set_database   | utf8                                                          |
| character_set_filesystem | binary                                                        |
| character_set_results    | utf8                                                          |
| character_set_server     | utf8                                                          |
| character_set_system     | utf8                                                          |
| character_sets_dir       | /usr/local/mysql-5.7.18-linux-glibc2.5-x86_64/share/charsets/ |
+--------------------------+---------------------------------------------------------------+
8 rows in set (0.00 sec)


字符校对规则

    说完字符集,就来看看字符的校对规则有哪些.

#显示utf8字符集下有哪些校对规则,节选
mysql> SHOW COLLATION like ‘utf8\_%‘;
+--------------------------+---------+-----+---------+----------+---------+
| Collation                | Charset | Id  | Default | Compiled | Sortlen |
+--------------------------+---------+-----+---------+----------+---------+
| utf8_general_ci          | utf8    |  33 | Yes     | Yes      |       1 |
| utf8_bin                 | utf8    |  83 |         | Yes      |       1 |
| utf8_unicode_ci          | utf8    | 192 |         | Yes      |       8 |
| utf8_icelandic_ci        | utf8    | 193 |         | Yes      |       8 |
| utf8_unicode_520_ci      | utf8    | 214 |         | Yes      |       8 |
| utf8_vietnamese_ci       | utf8    | 215 |         | Yes      |       8 |
| utf8_general_mysql500_ci | utf8    | 223 |         | Yes      |       1 |
+--------------------------+---------+-----+---------+----------+---------+
27 rows in set (0.00 sec)

    校对规则有很多,但是大部分我们用不到,大家也看到其他规则很多sortlen是8,比前两个比较常用的都多,会比较费资源是肯定的.

    每个字符集有一个默认校对规则,例如,utf8默认校对规则是utf8_general_ci.并存在校对规则命名约定:它们以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感),_cs(大小写敏感)或_bin(二元/大小写也敏感)结束。
    所以说,mysql的utf8字符集就默认对数据的大小写不敏感了.

    更改mysql的默认字符校对规则,也可以在配置文件my.cnf里添加

#要在[mysqld]子项添加
[mysqld]
#全局默认字符校对规则,按需求设定
collation_server = utf8_bin
#改完之后重启,进入mysql看一下,(不重启也行,一个个慢慢改吧)
mysql> show variables like ‘collation_%‘;
+----------------------+----------+
| Variable_name        | Value    |
+----------------------+----------+
| collation_connection | utf8_bin |
| collation_database   | utf8_bin |
| collation_server     | utf8_bin |
+----------------------+----------+
3 rows in set (0.00 sec)
#当然你也可以视实际情况只改库级别和链接级别,是允许不一样的,不过你要知道其中风险就是了
collation_database = utf8_bin
collation_connection = utf8_bin


注意

    要注意的是,这些更改都只对后续创建的数据库表和用户生效,已经存在的数据库是不受影响的,想要更改现有表的定义,那就必须更改表结构,或者重建数据库.

    更改的方法就是alter,创建的方法如果是默认就不需要干什么,如果不默认就要人为指定了.

#更改表的字符集和字符校对规则
ALTER TABLE 表名 MODIFY COLUMN 字段名 varchar(50) CHARACTER SET utf8 COLLATE utf8_bin;

    需要特别注意的是,对已有数据库的表更改字符校对规则并不影响表的使用,只要表的数据不存在冲突就可以,只是部分查询和排序/分组的操作会造成差距,但是字符集乱改的话,会直接造成数据乱码,所以要非常谨慎,有时候还不如重建数据库比较实际.

    如果仅是对数据库的表名大小写敏感进行修改,则my.cnf有一个专门的配置选项,直接配置完成后,重启就会忽略表名的大小写规则,lower_case_table_names

#要在[mysqld]子项添加
[mysqld]
#表名的大小写敏感选项,0为大小写敏感,1为大小写不敏感
lower_case_table_names = 1
#重启生效


以上是关于MySQL中数据库的默认字符集和校对规则都有哪些?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 字段内容区分大小写

mysql字符集和校对规则(Mysql校对集)

9.2 第九章 字符集

MySQL之字符集-校对规则

详细讲解MySQL的字符集与排序规则/校对规则(charactercollate)

详细讲解MySQL的字符集与排序规则/校对规则(charactercollate)