MySQL提供了区别级别的设置,MySQL提供了差别级别的安装

一 、内容概述

在MySQL的选用进度中,驾驭字符集、字符序的定义,以及区别设置对数据存款和储蓄、相比较的影响格外重庆大学。不少同学在一般工作中相见的“乱码”难点,很有或许就是因为对字符集与字符序的接头不成功、设置错误造成的。

正文由浅入深,分别介绍了如下内容:

  1. 字符集、字符序的基本概念及关联
  2. MySQL帮忙的字符集、字符序设置级,各设置级别之间的牵连
  3. server、database、table、column级字符集、字符序的查阅及安装
  4. 有道是什么时候设置字符集、字符序

带你肆分钟读懂MySQL字符集设置,mysql字符集

二 、字符集、字符序的概念与关系

在数据的贮存上,MySQL提供了差异的字符集帮衬。而在数量的相比操作上,则提供了分化的字符序帮衬。

MySQL提供了分化级其他装置,包罗server级、database级、table级、column级,能够提供充裕精准的安装。

怎么是字符集、字符序?不难的来说:

  1. 字符集(character set):定义了字符以及字符的编码。
  2. 字符序(collation):定义了字符的可比规则。

举个例证:

有多少个字符:A、B、a、b,那八个字符的编码分别是A = 0, B = 1, a = 2, b =
3。那里的字符 + 编码就组成了字符集(character set)。

设若我们想相比八个字符的轻重呢?比如A、B,或然a、b,最直观的相比艺术是利用它们的编码,比如因为0
< 1,所以 A < B。

除此以外,对于A、a,就算它们编码区别,但大家以为大小写字符应该是卓殊的,也正是说
A == a。

这地方定义了两条比较规则,这个相比规则的集聚正是collation。

  1. 同等是大写字符、小写字符,则比较他们的编码大小;
  2. 如果五个字符为大小写关系,则它们相当于。

壹 、内容概述

在MySQL的运用进度中,领会字符集、字符序的定义,以及差异设置对数据存款和储蓄、比较的熏陶极度主要。不少同校在平凡工作中遇到的“乱码”难点,很有可能就是因为对字符集与字符序的知情不到位、设置错误造成的。

正文循途守辙,分别介绍了如下内容:

  1. 字符集、字符序的基本概念及关联
  2. MySQL援救的字符集、字符序设置级,各设置级别之间的交换
  3. server、database、table、column级字符集、字符序的查看及安装
  4. 应当何时设置字符集、字符序

三 、MySQL援助的字符集、字符序

MySQL支持两种字符集 与 字符序。

  1. 叁个字符集对应至少一种字符序(一般是1对多)。
  2. 七个区别的字符集不能有同一的字符序。
  3. 每一种字符集都有暗中认可的字符序。

上边说的比较空虚,大家看下后边多少个小节就理解怎么回事了。

贰 、字符集、字符序的定义与联系

在数额的蕴藏上,MySQL提供了分裂的字符集扶助。而在多少的对峙统一操作上,则提供了差异的字符序扶助。

MySQL提供了不一样级其余安装,包含server级、database级、table级、column级,能够提供13分精准的装置。

怎么是字符集、字符序?简单的来说:

  1. 字符集(character set):定义了字符以及字符的编码。
  2. 字符序(collation):定义了字符的比较规则。

举个例子:

有多个字符:A、B、a、b,那多个字符的编码分别是A = 0, B = 1, a = 2, b =
3。那里的字符 + 编码就构成了字符集(character set)。

假定我们想比较五个字符的大小呢?比如A、B,可能a、b,最直观的比较艺术是利用它们的编码,比如因为0
< 1,所以 A < B。

别的,对于A、a,即便它们编码不一致,但大家觉得大小写字符应该是十二分的,也即是说
A == a。

这上边定义了两条相比规则,这一个相比较规则的集纳便是collation。

  1. 一样是大写字符、小写字符,则相比较他们的编码大小;
  2. 比方七个字符为大小写关系,则它们相当于。

一 、查看辅助的字符集

可以通过以下方法查看MYSQL接济的字符集。

方式一:

mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset  | Description                 | Default collation   | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese    | big5_chinese_ci     |      2 |
| dec8     | DEC West European           | dec8_swedish_ci     |      1 |
...省略

方式二:

mysql> use information_schema;
mysql> select * from CHARACTER_SETS;
+--------------------+----------------------+-----------------------------+--------+
| CHARACTER_SET_NAME | DEFAULT_COLLATE_NAME | DESCRIPTION                 | MAXLEN |
+--------------------+----------------------+-----------------------------+--------+
| big5               | big5_chinese_ci      | Big5 Traditional Chinese    |      2 |
| dec8               | dec8_swedish_ci      | DEC West European           |      1 |
...省略

当使用SHOW CHARACTER SET翻看时,也得以加上WHERELIKE范围标准。

例子一:使用WHERE界定条件。

mysql> SHOW CHARACTER SET WHERE Charset="utf8";
+---------+---------------+-------------------+--------+
| Charset | Description   | Default collation | Maxlen |
+---------+---------------+-------------------+--------+
| utf8    | UTF-8 Unicode | utf8_general_ci   |      3 |
+---------+---------------+-------------------+--------+
1 row in set (0.00 sec)

例子二:使用LIKE限定条件。

mysql> SHOW CHARACTER SET LIKE "utf8%";
+---------+---------------+--------------------+--------+
| Charset | Description   | Default collation  | Maxlen |
+---------+---------------+--------------------+--------+
| utf8    | UTF-8 Unicode | utf8_general_ci    |      3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci |      4 |
+---------+---------------+--------------------+--------+
2 rows in set (0.00 sec)

③ 、MySQL帮助的字符集、字符序

MySQL扶助三种字符集 与 字符序。

  1. 一个字符集对应至少一种字符序(一般是1对多)。
  2. 两个例外的字符集不能够有一样的字符序。
  3. 各类字符集都有暗许的字符序。

地点说的相比抽象,大家看下后边多少个小节就知道怎么回事了。

① 、查看帮忙的字符集

能够通过以下办法查看MYSQL支持的字符集。

方式一:

mysql> SHOW CHARACTER SET;
+----------+-----------------------------+---------------------+--------+
| Charset | Description   | Default collation | Maxlen |
+----------+-----------------------------+---------------------+--------+
| big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 |
| dec8 | DEC West European  | dec8_swedish_ci | 1 |
...省略

方式二:

mysql> use information_schema;
mysql> select * from CHARACTER_SETS;
+--------------------+----------------------+-----------------------------+--------+
| CHARACTER_SET_NAME | DEFAULT_COLLATE_NAME | DESCRIPTION   | MAXLEN |
+--------------------+----------------------+-----------------------------+--------+
| big5  | big5_chinese_ci | Big5 Traditional Chinese | 2 |
| dec8  | dec8_swedish_ci | DEC West European  | 1 |
...省略

当使用SHOW CHARACTE索罗德 SET查看时,也能够加上WHERE或LIKE限定条件。

事例一:使用WHERE限定标准。

mysql> SHOW CHARACTER SET WHERE Charset="utf8";
+---------+---------------+-------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+---------------+-------------------+--------+
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
+---------+---------------+-------------------+--------+
1 row in set (0.00 sec)

事例二:使用LIKE限定条件。

mysql> SHOW CHARACTER SET LIKE "utf8%";
+---------+---------------+--------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+---------------+--------------------+--------+
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
+---------+---------------+--------------------+--------+
2 rows in set (0.00 sec)

二 、查看援助的字符序

看似的,能够由此如下格局查看MYSQL协理的字符序。

主意一:通过SHOW COLLATION进行查看。

能够看看,utf8字符集有超越10种字符序。通过Default的值是或不是为Yes,判断是不是暗许的字符序。

mysql> SHOW COLLATION WHERE Charset = 'utf8';
+--------------------------+---------+-----+---------+----------+---------+
| Collation  | Charset | Id | Default | Compiled | Sortlen |
+--------------------------+---------+-----+---------+----------+---------+
| utf8_general_ci  | utf8 | 33 | Yes | Yes | 1 |
| utf8_bin   | utf8 | 83 |  | Yes | 1 |
...略

方式二:查询information_schema.COLLATIONS。

mysql> USE information_schema;
mysql> SELECT * FROM COLLATIONS WHERE CHARACTER_SET_NAME="utf8";
+--------------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME  | CHARACTER_SET_NAME | ID | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------------+--------------------+-----+------------+-------------+---------+
| utf8_general_ci  | utf8  | 33 | Yes | Yes  | 1 |
| utf8_bin   | utf8  | 83 |  | Yes  | 1 |
| utf8_unicode_ci  | utf8  | 192 |  | Yes  | 8 |

③ 、字符序的命名规范

字符序的命名,以其对应的字符集作为前缀,如下所示。比如字符序utf8_general_ci,标明它是字符集utf8的字符序。

更加多规则能够参考 官方文档。

MariaDB [information_schema]> SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM COLLATIONS WHERE CHARACTER_SET_NAME="utf8" limit 2; 
+--------------------+-----------------+
| CHARACTER_SET_NAME | COLLATION_NAME |
+--------------------+-----------------+
| utf8  | utf8_general_ci |
| utf8  | utf8_bin |
+--------------------+-----------------+
2 rows in set (0.00 sec)

贰 、查看援救的字符序

好像的,能够透过如下方式查看MYSQL协理的字符序。

方式一:通过SHOW COLLATION进展查看。

能够看来,utf8字符集有当先10种字符序。通过Default的值是还是不是为Yes,判断是还是不是暗许的字符序。

mysql> SHOW COLLATION WHERE Charset = 'utf8';
+--------------------------+---------+-----+---------+----------+---------+
| Collation                | Charset | Id  | Default | Compiled | Sortlen |
+--------------------------+---------+-----+---------+----------+---------+
| utf8_general_ci          | utf8    |  33 | Yes     | Yes      |       1 |
| utf8_bin                 | utf8    |  83 |         | Yes      |       1 |
...略

方式二:查询information_schema.COLLATIONS

mysql> USE information_schema;
mysql> SELECT * FROM COLLATIONS WHERE CHARACTER_SET_NAME="utf8";
+--------------------------+--------------------+-----+------------+-------------+---------+
| COLLATION_NAME           | CHARACTER_SET_NAME | ID  | IS_DEFAULT | IS_COMPILED | SORTLEN |
+--------------------------+--------------------+-----+------------+-------------+---------+
| utf8_general_ci          | utf8               |  33 | Yes        | Yes         |       1 |
| utf8_bin                 | utf8               |  83 |            | Yes         |       1 |
| utf8_unicode_ci          | utf8               | 192 |            | Yes         |       8 |

四 、server的字符集、字符序

用途:当您创建数据库,且从未点名字符集、字符序时,server字符集、server字符序就会作为该数据库的暗中同意字符集、排序规则。

如何指定:MySQL服务运营时,可因而命令行参数钦命。也足以通过计划文件的变量钦赐。

server暗中同意字符集、字符序:在MySQL编译的时候,通过编译参数内定。

character_set_server、collation_server分别对应server字符集、server字符序。

1、查看server字符集、字符序

分级对应character_set_server、collation_server五个种类变量。

mysql> SHOW VARIABLES LIKE "character_set_server";
mysql> SHOW VARIABLES LIKE "collation_server";

② 、运行服务时钦命

能够在MySQL服务运行时,钦定server字符集、字符序。如不钦定,暗许的字符序分别为latin一 、latin1_swedish_ci

mysqld --character-set-server=latin1 \
 --collation-server=latin1_swedish_ci

单身钦赐server字符集,此时,server字符序为latin1的暗中认可字符序latin1_swedish_ci。

mysqld --character-set-server=latin1

叁 、配置文件内定

除此而外在命令行参数里内定,也能够在配备文件里钦命,如下所示。

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

四 、运营时修改

事例:运营时修改(重启后会失效,如若想要重启后维持不变,需求写进配置文件里)

mysql> SET character_set_server = utf8 ;

⑤ 、编写翻译时内定暗许字符集、字符序

character_set_server、collation_server的暗中认可值,能够在MySQL编译时,通过编写翻译选项钦命:

cmake . -DDEFAULT_CHARSET=latin1 \
  -DDEFAULT_COLLATION=latin1_german1_ci

三 、字符序的命名规范

字符序的命名,以其对应的字符集作为前缀,如下所示。比如字符序utf8_general_ci,标明它是字符集utf8的字符序。

越多规则能够参考
法定文书档案

MariaDB [information_schema]> SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM COLLATIONS WHERE CHARACTER_SET_NAME="utf8" limit 2; 
+--------------------+-----------------+
| CHARACTER_SET_NAME | COLLATION_NAME  |
+--------------------+-----------------+
| utf8               | utf8_general_ci |
| utf8               | utf8_bin        |
+--------------------+-----------------+
2 rows in set (0.00 sec)

伍 、database的字符集、字符序

用途:钦命数据库级其他字符集、字符序。同三个MySQL服务下的数据库,能够独家钦定区别的字符集/字符序。

① 、设置数据的字符集/字符序

能够在制造、修改数据库的时候,通过CHARACTE安德拉SET、COLLATE钦命数据库的字符集、排序规则。

创办数据库:

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]

事例:成立数据库test_schema,字符集设置为utf8,此时暗中同意的排序规则为utf8_general_ci。

CREATE DATABASE `test_schema` DEFAULT CHARACTER SET utf8;

② 、查看数据库的字符集/字符序

有3种格局能够查阅数据库的字符集/字符序。

例子一:查看test_schema的字符集、排序规则。(需求切换暗中认可数据库)

mysql> use test_schema;
Database changed
mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8   | utf8_general_ci |
+--------------------------+----------------------+
1 row in set (0.00 sec)

事例二:也得以经过下边发号施令查看test_schema的字符集、数据库(不要求切换私下认可数据库)

mysql> SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE schema_name="test_schema";
+-------------+----------------------------+------------------------+
| SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+-------------+----------------------------+------------------------+
| test_schema | utf8   | utf8_general_ci |
+-------------+----------------------------+------------------------+
1 row in set (0.00 sec)

事例三:也得以通过翻看创设数据库的口舌,来查阅字符集。

mysql> SHOW CREATE DATABASE test_schema;
+-------------+----------------------------------------------------------------------+
| Database | Create Database       |
+-------------+----------------------------------------------------------------------+
| test_schema | CREATE DATABASE `test_schema` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+-------------+----------------------------------------------------------------------+
1 row in set (0.00 sec)

③ 、database字符集、字符序是怎么鲜明的

创设数据库时,钦命了CHARACTELX570SET或COLLATE,则以对应的字符集、排序规则为准。
创设数据库时,假使没有点名字符集、排序规则,则以character_set_server、collation_server为准。

肆 、server的字符集、字符序

用途:当您创设数据库,且从未点名字符集、字符序时,server字符集、server字符序就会作为该数据库的默许字符集、排序规则。

怎么样钦命:MySQL服务运维时,可由此命令行参数钦命。也得以因而陈设文件的变量钦点。

server暗中认可字符集、字符序:在MySQL编写翻译的时候,通过编写翻译参数内定。

character_set_servercollation_server各自对应server字符集、server字符序。

⑥ 、table的字符集、字符序

成立表、修改表的语法如下,可因而CHARACTE奥迪Q3SET、COLLATE设置字符集、字符序。

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]

一 、创造table并点名字符集/字符序

事例如下,钦点字符集为utf8,字符序则动用暗许的。

CREATE TABLE `test_schema`.`test_table` (
 `id` INT NOT NULL COMMENT '',
 PRIMARY KEY (`id`) COMMENT '')
DEFAULT CHARACTER SET = utf8;

二 、查看table的字符集/字符序

一致,有3种形式得以查阅table的字符集/字符序。

方式一:通过SHOW TABLE
STATUS查看table状态,注意Collation为utf8_general_ci,对应的字符集为utf8。

MariaDB [blog]> SHOW TABLE STATUS FROM test_schema \G;
*************************** 1. row ***************************
  Name: test_table
  Engine: InnoDB
 Version: 10
 Row_format: Compact
  Rows: 0
 Avg_row_length: 0
 Data_length: 16384
Max_data_length: 0
 Index_length: 0
 Data_free: 11534336
 Auto_increment: NULL
 Create_time: 2018-01-09 16:10:42
 Update_time: NULL
 Check_time: NULL
 Collation: utf8_general_ci
 Checksum: NULL
 Create_options: 
 Comment: 
1 row in set (0.00 sec)

方式二:查看information_schema.TABLES的信息。

mysql> USE test_schema;
mysql> SELECT TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA = "test_schema" AND TABLE_NAME = "test_table";
+-----------------+
| TABLE_COLLATION |
+-----------------+
| utf8_general_ci |
+-----------------+

方式三:通过SHOW CREATE TABLE确认。

mysql> SHOW CREATE TABLE test_table;
+------------+----------------------------------------------------------------------------------------------------------------+
| Table | Create Table             |
+------------+----------------------------------------------------------------------------------------------------------------+
| test_table | CREATE TABLE `test_table` (
 `id` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+------------+----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

③ 、table字符集、字符序怎么样鲜明

要是CHARACTEOdysseySET、COLLATE的值分别是charset_name、collation_name。假若创制table时:

明确了charset_name、collation_name,则采用charset_name、collation_name。
只肯定了charset_name,但collation_name未分明,则字符集选用charset_name,字符序接纳charset_name对应的私下认可字符序。

只眼看了collation_name,但charset_name未分明,则字符序选拔collation_name,字符集采取collation_name关联的字符集。

charset_name、collation_name均未显明,则运用数据库的字符集、字符序设置。

1、查看server字符集、字符序

分级对应character_set_servercollation_server八个种类变量。

mysql> SHOW VARIABLES LIKE "character_set_server";
mysql> SHOW VARIABLES LIKE "collation_server";

⑦ 、column的字符集、排序

品类为CHAXC60、VAOdysseyCHAENCORE、TEXT的列,可以钦命字符集/字符序,语法如下:

col_name {CHAR | VARCHAR | TEXT} (col_length)
 [CHARACTER SET charset_name]
 [COLLATE collation_name]

一 、新增column并钦定字符集/排序规则

事例如下:(成立table类似)

mysql> ALTER TABLE test_table ADD COLUMN char_column VARCHAR(25) CHARACTER SET utf8;

② 、查看column的字符集/字符序

事例如下:

mysql> SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA="test_schema" AND TABLE_NAME="test_table" AND COLUMN_NAME="char_column";
+--------------------+-----------------+
| CHARACTER_SET_NAME | COLLATION_NAME |
+--------------------+-----------------+
| utf8  | utf8_general_ci |
+--------------------+-----------------+
1 row in set (0.00 sec)

③ 、column字符集/排序规则规定

只要CHARACTERAV4 SET、COLLATE的值分别是charset_name、collation_name:

如果charset_name、collation_name均分明,则字符集、字符序以charset_name、collation_name为准。

只显明了charset_name,collation_name未显明,则字符集为charset_name,字符序为charset_name的私下认可字符序。

只眼看了collation_name,charset_name未明朗,则字符序为collation_name,字符集为collation_name关联的字符集。

charset_name、collation_name均未鲜明,则以table的字符集、字符序为准。

贰 、运转服务时钦赐

能够在MySQL服务运营时,钦点server字符集、字符序。如不钦定,默许的字符序分别为latin1latin1_swedish_ci

mysqld --character-set-server=latin1 \
       --collation-server=latin1_swedish_ci

单独钦命server字符集,此时,server字符序为latin1的默许字符序latin1_swedish_ci

mysqld --character-set-server=latin1

⑧ 、采用:几时设置字符集、字符序

诚如的话,能够在五个地点进行布置:

成立数据库的时候进行配置。

mysql server运行的时候实行安插。

从源码编译mysql的时候,通过编写翻译参数实行布置

一 、方式一:创制数据库的时候举行安顿

这种艺术相比较灵敏,也正如有限支持,它不依靠于暗许的字符集/字符序。当您创建数据库的时候钦点字符集/字符序,后续成立table、column的时候,借使不特殊钦命,会持续对应数据库的字符集/字符序。

CREATE DATABASE mydb
 DEFAULT CHARACTER SET utf8
 DEFAULT COLLATE utf8_general_ci;

② 、方式二:mysql server运转的时候实行安插

能够拉长以下配置,那样mysql
server运行的时候,会对character-set-server、collation-server进行配备。

当您通过mysql
client创设database/table/column,且没有展现阐明字符集/字符序,那么就会用character-set-server/collation-server作为暗中认可的字符集/字符序。

别的,client、server连接时的字符集/字符序,如故必要通过SET
NAMES进行设置。

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

叁 、情势三:从源码编写翻译mysql的时候,通过编写翻译参数举行设置

编译的时候即便钦定了-DDEFAULT_CHARSET和-DDEFAULT_COLLATION,那么:

开创database、table时,会将其看作私下认可的字符集/字符序。

client连接server时,会将其当做暗中同意的字符集/字符序。(不用单独SET
NAMES)

shell> cmake . -DDEFAULT_CHARSET=utf8 \
  -DDEFAULT_COLLATION=utf8_general_ci

三 、配置文件钦点

除却在命令行参数里钦点,也得以在配备文件里钦命,如下所示。

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

⑨ 、写在末端

本文较为详细地介绍了MySQL中字符集、字符序相关的内容,那有的内容首要针对的是数量的蕴藏与相比。其实还有很要紧的一某些情节还没提到:针对三番五次的字符集、字符序设置。

出于一连的字符集、字符序设置不当造成的乱码难题也不行多,那部分内容开始展览来讲内容也不少,放在下一篇小说进行教学。

肆 、运转时修改

事例:运转时修改(重启后会失效,假诺想要重启后保持不变,供给写进配置文件里)

mysql> SET character_set_server = utf8 ;

10、相关链接

10.1 Character Set Support

https://dev.mysql.com/doc/refman/5.7/en/charset.html

总结

以上所述是小编给我们介绍的带您四分钟读懂MySQL字符集设置,希望对我们享有扶助,借使我们有别的疑问请给自家留言,小编会及时回复大家的。在此也至极感激我们对帮客之家网站的支撑!

http://www.bkjia.com/Mysql/1281028.htmlwww.bkjia.comtruehttp://www.bkjia.com/Mysql/1281028.htmlTechArticle带你5分钟读懂MySQL字符集设置,mysql字符集
一 、内容概述
在MySQL的使用进度中,了然字符集、字符序的概念,以及分化设置对数码存款和储蓄、比…

伍 、编写翻译时钦命私下认可字符集、字符序

character_set_servercollation_server的暗许值,可以在MySQL编写翻译时,通过编写翻译选项钦命:

cmake . -DDEFAULT_CHARSET=latin1 \
           -DDEFAULT_COLLATION=latin1_german1_ci

伍 、database的字符集、字符序

用途:钦赐数据库级别的字符集、字符序。同二个MySQL服务下的数据库,能够分别钦赐分化的字符集/字符序。

一 、设置数据的字符集/字符序

能够在成立、修改数据库的时候,通过CHARACTER SETCOLLATE点名数据库的字符集、排序规则。

创设数据库:

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]

事例:创制数据库test_schema,字符集设置为utf8,此时私下认可的排序规则为utf8_general_ci

CREATE DATABASE `test_schema` DEFAULT CHARACTER SET utf8;

② 、查看数据库的字符集/字符序

有3种方式得以查阅数据库的字符集/字符序。

例子一:查看test_schema的字符集、排序规则。(必要切换私下认可数据库)

mysql> use test_schema;
Database changed
mysql> SELECT @@character_set_database, @@collation_database;
+--------------------------+----------------------+
| @@character_set_database | @@collation_database |
+--------------------------+----------------------+
| utf8                     | utf8_general_ci      |
+--------------------------+----------------------+
1 row in set (0.00 sec)

事例二:也可以经过下边发号施令查看test_schema的字符集、数据库(不须求切换暗中认可数据库)

mysql> SELECT SCHEMA_NAME, DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME  FROM information_schema.SCHEMATA WHERE schema_name="test_schema";
+-------------+----------------------------+------------------------+
| SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+-------------+----------------------------+------------------------+
| test_schema | utf8                       | utf8_general_ci        |
+-------------+----------------------------+------------------------+
1 row in set (0.00 sec)

事例三:也能够因此查阅创设数据库的说话,来查阅字符集。

mysql> SHOW CREATE DATABASE test_schema;
+-------------+----------------------------------------------------------------------+
| Database    | Create Database                                                      |
+-------------+----------------------------------------------------------------------+
| test_schema | CREATE DATABASE `test_schema` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+-------------+----------------------------------------------------------------------+
1 row in set (0.00 sec)

三 、database字符集、字符序是怎么规定的

  • 创设数据库时,钦赐了CHARACTER SETCOLLATE,则以对应的字符集、排序规则为准。
  • 成立数据库时,假若没有点名字符集、排序规则,则以character_set_servercollation_server为准。

⑥ 、table的字符集、字符序

创办表、修改表的语法如下,可透过CHARACTER SETCOLLATE安装字符集、字符序。

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]

① 、创立table并钦命字符集/字符序

事例如下,钦命字符集为utf8,字符序则动用默许的。

CREATE TABLE `test_schema`.`test_table` (
  `id` INT NOT NULL COMMENT '',
  PRIMARY KEY (`id`)  COMMENT '')
DEFAULT CHARACTER SET = utf8;

二 、查看table的字符集/字符序

同等,有3种方法能够查阅table的字符集/字符序。

方式一:通过SHOW TABLE STATUS查看table状态,注意Collationutf8_general_ci,对应的字符集为utf8

MariaDB [blog]> SHOW TABLE STATUS FROM test_schema \G;
*************************** 1. row ***************************
           Name: test_table
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 0
 Avg_row_length: 0
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 11534336
 Auto_increment: NULL
    Create_time: 2018-01-09 16:10:42
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)

方式二:查看information_schema.TABLES的信息。

mysql> USE test_schema;
mysql> SELECT TABLE_COLLATION FROM information_schema.TABLES WHERE TABLE_SCHEMA = "test_schema" AND TABLE_NAME = "test_table";
+-----------------+
| TABLE_COLLATION |
+-----------------+
| utf8_general_ci |
+-----------------+

方式三:通过SHOW CREATE TABLE确认。

mysql> SHOW CREATE TABLE test_table;
+------------+----------------------------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                                   |
+------------+----------------------------------------------------------------------------------------------------------------+
| test_table | CREATE TABLE `test_table` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+------------+----------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

③ 、table字符集、字符序怎么样鲜明

假设CHARACTER SETCOLLATE的值分别是charset_namecollation_name。假使创立table时:

  • 明确了charset_namecollation_name,则采用charset_namecollation_name
  • 只眼看了charset_name,但collation_name未明显,则字符集接纳charset_name,字符序采取charset_name对应的暗许字符序。
  • 只眼看了collation_name,但charset_name未鲜明,则字符序选用collation_name,字符集选择collation_name关联的字符集。
  • charset_namecollation_name均未明朗,则选择数据库的字符集、字符序设置。

7、column的字符集、排序

体系为CHALAND、VAOdysseyCHA福睿斯、TEXT的列,能够钦定字符集/字符序,语法如下:

col_name {CHAR | VARCHAR | TEXT} (col_length)
    [CHARACTER SET charset_name]
    [COLLATE collation_name]

壹 、新增column并点名字符集/排序规则

事例如下:(成立table类似)

mysql> ALTER TABLE test_table ADD COLUMN char_column VARCHAR(25) CHARACTER SET utf8;

二 、查看column的字符集/字符序

事例如下:

mysql> SELECT CHARACTER_SET_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA="test_schema" AND TABLE_NAME="test_table" AND COLUMN_NAME="char_column";
+--------------------+-----------------+
| CHARACTER_SET_NAME | COLLATION_NAME  |
+--------------------+-----------------+
| utf8               | utf8_general_ci |
+--------------------+-----------------+
1 row in set (0.00 sec)

三 、column字符集/排序规则规定

假设CHARACTER SETCOLLATE的值分别是charset_namecollation_name

  • 如果charset_namecollation_name均强烈,则字符集、字符序以charset_namecollation_name为准。
  • 只肯定了charset_namecollation_name未明朗,则字符集为charset_name,字符序为charset_name的暗中同意字符序。
  • 只肯定了collation_namecharset_name未明朗,则字符序为collation_name,字符集为collation_name涉嫌的字符集。
  • charset_namecollation_name均未明显,则以table的字符集、字符序为准。

八 、选拔:什么时候设置字符集、字符序

诚如的话,能够在多少个地点进行布置:

  1. 始建数据库的时候举办配置。
  2. mysql server运转的时候进行布置。
  3. 从源码编写翻译mysql的时候,通过编写翻译参数举办布署

① 、方式一:创造数据库的时候实行配备

这种措施相比较灵敏,也正如保障,它不借助于于默许的字符集/字符序。当你创制数据库的时候内定字符集/字符序,后续成立table、column的时候,如若不特别内定,会持续对应数据库的字符集/字符序。

CREATE DATABASE mydb
  DEFAULT CHARACTER SET utf8
  DEFAULT COLLATE utf8_general_ci;

贰 、情势二:mysql server运行的时候举行计划

能够加上以下配置,那样mysql
server运行的时候,会对character-set-server、collation-server实行布署。

当您通过mysql
client创制database/table/column,且尚未体现注解字符集/字符序,那么就会用character-set-server/collation-server作为暗许的字符集/字符序。

除此以外,client、server连接时的字符集/字符序,依然须要通过SET
NAMES举办安装。

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

叁 、格局三:从源码编写翻译mysql的时候,通过编写翻译参数实行设置

编写翻译的时候如若钦定了-DDEFAULT_CHARSET-DDEFAULT_COLLATION,那么:

  • 成立database、table时,会将其作为暗许的字符集/字符序。
  • client连接server时,会将其看做私下认可的字符集/字符序。(不用单独SET
    NAMES)

    shell> cmake . -DDEFAULT_CHARSET=utf8 \

           -DDEFAULT_COLLATION=utf8_general_ci
    

⑨ 、写在前面

正文较为详细地介绍了MySQL中字符集、字符序相关的内容,那有些剧情主要针对的是数码的蕴藏与比较。其实还有很重庆大学的一有的内容还没涉及:针对延续的字符集、字符序设置。

鉴于一而再的字符集、字符序设置不当导致的乱码难题也不行多,这一部分内容展开来讲内容也不少,放在下一篇小说进行教学。

字数所限,有个别剧情从未细讲,感兴趣的同学欢迎沟通,大概查看官方文书档案。如有错漏,敬请建议。

⑩ 、相关链接

10.1 Character Set Support
https://dev.mysql.com/doc/refman/5.7/en/charset.html

相关文章

网站地图xml地图