Heim  >  Artikel  >  Datenbank  >  Verstehen Sie die MySQL-Zeichensatzeinstellungen in 5 Minuten

Verstehen Sie die MySQL-Zeichensatzeinstellungen in 5 Minuten

小云云
小云云Original
2018-01-11 13:15:591254Durchsuche

In diesem Artikel werden hauptsächlich die Konzepte und Zusammenhänge des MySQL-Zeichensatzes und der Zeichenreihenfolge vorgestellt und Ihnen verschiedene Möglichkeiten zur Anzeige der von MYSQL unterstützten Zeichensätze vorgestellt. Weitere Informationen finden Sie in diesem Artikel. Ich hoffe, er kann Ihnen helfen.

1. Inhaltsübersicht

Bei der Verwendung von MySQL ist es sehr wichtig, die Konzepte des Zeichensatzes und der Zeichenreihenfolge sowie deren Auswirkungen zu verstehen verschiedene Einstellungen zur Datenspeicherung und zum Vergleich. Das Problem des „verstümmelten Codes“, mit dem viele Studenten in ihrer täglichen Arbeit konfrontiert sind, wird höchstwahrscheinlich durch ein unzureichendes Verständnis von Zeichensätzen und Zeichenfolgen sowie falsche Einstellungen verursacht.

In diesem Artikel werden die folgenden Inhalte von der Tiefe zur Tiefe vorgestellt:

  1. Grundlegende Konzepte und Zusammenhänge von Zeichensätzen und Zeichenfolgen

  2. Von MySQL unterstützte Zeichensatz- und Zeichenreihenfolge-Einstellungsebenen und die Beziehung zwischen den einzelnen Einstellungsebenen

  3. Zeichensatz auf Server-, Datenbank-, Tabellen-, Spaltenebene und Zeichenreihenfolge anzeigen und festlegen

  4. Wann sollten Sie den Zeichensatz und die Zeichenfolge festlegen?

2. Zeichensatz und Zeichenfolge Konzepte und Verbindungen

In Bezug auf die Datenspeicherung bietet MySQL unterschiedliche Zeichensatzunterstützung. Für Datenvergleichsoperationen wird eine unterschiedliche Zeichenreihenfolge unterstützt.

MySQL bietet verschiedene Einstellungsebenen, einschließlich Serverebene, Datenbankebene, Tabellenebene und Spaltenebene, die sehr präzise Einstellungen ermöglichen können.

Was ist ein Zeichensatz und eine Zeichenreihenfolge? Einfach ausgedrückt:

  1. Zeichensatz (Zeichensatz): Definiert Zeichen und Zeichenkodierung.

  2. Zeichenreihenfolge (Sortierung): Definiert die Vergleichsregeln von Zeichen.

Zum Beispiel:

hat vier Zeichen: A, B, a, b. Die Codes dieser vier Zeichen sind A = 0, B = 1. a = 2, b = 3. Die Zeichen + Codierung bilden hier den Zeichensatz.

Was wäre, wenn wir die Größe zweier Zeichen vergleichen möchten? Beispielsweise ist A, B oder a, b die intuitivste Möglichkeit zum Vergleichen, da beispielsweise 0 <

Außerdem sind wir der Meinung, dass Groß- und Kleinbuchstaben für A und a gleich sein sollten, obwohl sie unterschiedliche Codierungen haben, d. h. A == a.

Oben sind zwei Vergleichsregeln definiert, und der Satz dieser Vergleichsregeln ist die Kollation.

  1. Wenn es sich sowohl um Groß- als auch um Kleinbuchstaben handelt, vergleichen Sie ihre Kodierungsgrößen.

  2. Wenn die beiden Zeichen eine Beziehung zwischen Groß- und Kleinschreibung haben, sind sie gleich .

3. Von MySQL unterstützte Zeichensätze und Zeichenfolgen

MySQL unterstützt mehrere Zeichensätze und Zeichenfolgen.

  1. Ein Zeichensatz entspricht mindestens einer Zeichenfolge (normalerweise 1 zu viele).

  2. Zwei verschiedene Zeichensätze können nicht dieselbe Zeichenfolge haben.

  3. Jeder Zeichensatz hat eine Standardzeichenreihenfolge.

Das Obige ist relativ abstrakt. Schauen wir uns die nächsten Abschnitte an, um zu verstehen, was los ist.

1. Überprüfen Sie die unterstützten Zeichensätze

Sie können die von MYSQL unterstützten Zeichensätze mit den folgenden Methoden überprüfen.

Methode 1:

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 |
...省略</p>
<p>Methode 2: </p>
<pre class="brush:php;toolbar:false">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 |
...省略

Bei der Anzeige mit SHOW CHARACTER SET können Sie auch WHERE- oder LIKE-Qualifizierungsbedingungen hinzufügen.

Beispiel 1: WHERE-Qualifikation verwenden.

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)

Beispiel 2: LIKE-Qualifikation verwenden.

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)

2. Überprüfen Sie die unterstützte Zeichenreihenfolge

Ähnlich können Sie die von MYSQL unterstützte Zeichenreihenfolge auf folgende Weise überprüfen.

Methode 1: Überprüfen Sie durch SHOW COLLATION.

Wie Sie sehen, umfasst der utf8-Zeichensatz mehr als 10 Zeichenfolgen. Bestimmen Sie, ob die Zeichenfolge die Standardsequenz ist, indem Sie prüfen, ob der Wert „Standard“ „Ja“ lautet.

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 |
...略

Methode 2: Abfrage 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 |

3. Benennungsspezifikation der Zeichenfolge

Der Benennung der Zeichenfolge wird der entsprechende Zeichensatz vorangestellt, wie unten gezeigt. Beispielsweise gibt die Zeichenfolge utf8_general_ci an, dass es sich um die Zeichenfolge des Zeichensatzes utf8 handelt.

Weitere Regeln finden Sie in der offiziellen Dokumentation.

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)

4. Server-Zeichensatz und -Zeichenfolge

Zweck: Wenn Sie eine Datenbank erstellen und den Zeichensatz und die Zeichenfolge nicht angeben, werden der Server-Zeichensatz und der Server angegeben Zeichen Die Reihenfolge wird als Standardzeichensatz und -sortierung der Datenbank verwendet.

Angabe: Wenn der MySQL-Dienst gestartet wird, kann er über Befehlszeilenparameter angegeben werden. Es kann auch über Variablen in der Konfigurationsdatei angegeben werden.

Standardzeichensatz und Zeichenfolge des Servers: werden beim Kompilieren von MySQL durch Kompilierungsparameter angegeben.

character_set_server und collation_server entsprechen dem Serverzeichensatz bzw. der Serverzeichenfolge.

1. Überprüfen Sie den Serverzeichensatz und die Zeichenfolge

entsprechend den beiden Systemvariablen „character_set_server“ und „collation_server“.

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

2. Geben Sie beim Starten des Dienstes

an. Sie können den Serverzeichensatz und die Zeichenfolge angeben, wenn Sie den MySQL-Dienst starten. Wenn nicht angegeben, sind die Standardzeichenfolgen latin1, latin1_swedish_ci

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

. Geben Sie den Serverzeichensatz separat an. Zu diesem Zeitpunkt ist die Serverzeichenfolge die Standardzeichenfolge latin1_swedish_ci.

mysqld --character-set-server=latin1

3. Spezifikation der Konfigurationsdatei

Zusätzlich zur Angabe in den Befehlszeilenparametern kann sie auch in der Konfigurationsdatei angegeben werden, wie unten gezeigt.

[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

4. Laufzeitänderung

Beispiel: Laufzeitänderung (sie wird nach dem Neustart ungültig. Wenn Sie möchten, dass sie nach dem Neustart unverändert bleibt, müssen Sie sie in die Konfigurationsdatei schreiben )

mysql> SET character_set_server = utf8 ;

5、编译时指定默认字符集、字符序

character_set_server、collation_server的默认值,可以在MySQL编译时,通过编译选项指定:

cmake . -DDEFAULT_CHARSET=latin1 \
  -DDEFAULT_COLLATION=latin1_german1_ci

五、database的字符集、字符序

用途:指定数据库级别的字符集、字符序。同一个MySQL服务下的数据库,可以分别指定不同的字符集/字符序。

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

可以在创建、修改数据库的时候,通过CHARACTER 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;

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

有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)

3、database字符集、字符序是怎么确定的

创建数据库时,指定了CHARACTER SET或COLLATE,则以对应的字符集、排序规则为准。
创建数据库时,如果没有指定字符集、排序规则,则以character_set_server、collation_server为准。

六、table的字符集、字符序

创建表、修改表的语法如下,可通过CHARACTER SET、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]

1、创建table并指定字符集/字符序

例子如下,指定字符集为utf8,字符序则采用默认的。

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

2、查看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)

3、table字符集、字符序如何确定

假设CHARACTER SET、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均未明确,则采用数据库的字符集、字符序设置。

七、column的字符集、排序

类型为CHAR、VARCHAR、TEXT的列,可以指定字符集/字符序,语法如下:

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

1、新增column并指定字符集/排序规则

例子如下:(创建table类似)

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

2、查看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)

3、column字符集/排序规则确定

假设CHARACTER 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启动的时候进行配置。

从源码编译mysql的时候,通过编译参数进行配置

1、方式一:创建数据库的时候进行配置

这种方式比较灵活,也比较保险,它不依赖于默认的字符集/字符序。当你创建数据库的时候指定字符集/字符序,后续创建table、column的时候,如果不特殊指定,会继承对应数据库的字符集/字符序。

CREATE DATABASE mydb
 DEFAULT CHARACTER SET utf8
 DEFAULT COLLATE utf8_general_ci;

2、方式二: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

3、方式三:从源码编译mysql的时候,通过编译参数进行设置

编译的时候如果指定了-DDEFAULT_CHARSET和-DDEFAULT_COLLATION,那么:

创建database、table时,会将其作为默认的字符集/字符序。

client连接server时,会将其作为默认的字符集/字符序。(不用单独SET NAMES)

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

九、写在后面

本文较为详细地介绍了MySQL中字符集、字符序相关的内容,这部分内容主要针对的是数据的存储与比较。其实还有很重要的一部分内容还没涉及:针对连接的字符集、字符序设置。

由于连接的字符集、字符序设置不当导致的乱码问题也非常多,这部分内容展开来讲内容也不少,放在下一篇文章进行讲解。

相关推荐:

MySQL字符集和校对顺序简介

关于MySQL字符集问题详解(图)

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

Das obige ist der detaillierte Inhalt vonVerstehen Sie die MySQL-Zeichensatzeinstellungen in 5 Minuten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn