5분 만에 MySQL 문자 집합 설정 이해

小云云
풀어 주다: 2018-01-11 13:15:59
원래의
1243명이 탐색했습니다.

이 글에서는 주로 mysql 문자셋의 개념과 연관성, 문자순서를 소개하고, MYSQL에서 지원하는 문자셋을 보는 다양한 방법을 공유합니다. 구체적인 내용은 이 글을 참고해 주시길 바라며, 도움이 되셨으면 좋겠습니다.

1. 콘텐츠 개요

MySQL을 사용하는 과정에서는 문자 집합과 문자 순서의 개념뿐만 아니라 다양한 설정이 데이터 저장 및 비교에 미치는 영향을 이해하는 것이 매우 중요합니다. 많은 학생들이 일상 업무에서 직면하는 "깨진" 문제는 문자 집합과 문자 순서에 대한 부적절한 이해 또는 잘못된 설정으로 인해 발생할 가능성이 높습니다.

이 기사에서는 다음 내용을 얕은 것부터 깊은 것까지 소개합니다.

  1. 문자 집합과 문자 시퀀스의 기본 개념과 연결

  2. MySQL에서 지원하는 문자 집합 및 문자 시퀀스 설정 수준과 연결 각 설정 수준 사이

  3. 서버, 데이터베이스, 테이블, 열 수준 문자 집합 및 문자 순서 보기 및 설정

  4. 문자 집합 및 문자 순서를 언제 설정해야 합니까

2. 개념 문자 집합 및 문자 순서 문의

데이터 저장 측면에서 MySQL은 다양한 문자 집합 지원을 제공합니다. 데이터 비교 작업을 위해 다양한 문자 순서 지원이 제공됩니다.

MySQL은 서버 수준, 데이터베이스 수준, 테이블 수준, 열 수준 등 다양한 수준의 설정을 제공하므로 매우 정확한 설정을 제공할 수 있습니다.

문자셋과 문자순서는 무엇인가요? 간단히 말하면:

  1. 문자 집합(character set): 문자 및 문자 인코딩을 정의합니다.

  2. 문자 순서(조합): 문자의 비교 규칙을 정의합니다.

예:

에는 A, B, a, b라는 네 개의 문자가 있습니다. 이 네 문자의 코드는 A = 0, B = 1, a = 2, b = 3입니다. 여기서 문자 + 인코딩은 문자 세트를 구성합니다.

두 글자의 크기를 비교하고 싶다면 어떻게 해야 할까요? 예를 들어, A, B 또는 a, b를 비교하는 가장 직관적인 방법은 해당 인코딩을 사용하는 것입니다. 예를 들어 0

또한 A와 a의 경우 인코딩은 다르지만 대문자와 소문자는 동일해야 한다고 생각합니다. 즉, A == a입니다.

위에서는 두 가지 비교 규칙이 정의되어 있으며 이러한 비교 규칙의 집합이 대조입니다.

  1. 대문자와 소문자 모두인 경우 인코딩 크기를 비교하세요.

  2. 두 문자가 대소문자 관계에 있으면 동일합니다.

3. MySQL에서 지원되는 문자 세트 및 문자 시퀀스

MySQL은 여러 문자 세트 및 문자 시퀀스를 지원합니다.

  1. 문자 집합은 하나 이상의 문자 시퀀스(보통 1~다)에 해당합니다.

  2. 두 개의 서로 다른 문자 세트는 동일한 문자 순서를 가질 수 없습니다.

  3. 각 문자 집합에는 기본 문자 순서가 있습니다.

위 내용은 비교적 추상적입니다. 무슨 일이 일어나고 있는지 이해하기 위해 다음 몇 가지 섹션을 살펴보겠습니다.

1. 지원되는 문자셋 확인하기

MYSQL에서 지원하는 문자셋은 다음과 같은 방법으로 확인할 수 있습니다.

방법 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 |
...省略
로그인 후 복사

방법 2:

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을 이용해 보실 때 WHERE나 LIKE 조건을 추가하실 수도 있습니다.

예 1: 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)
로그인 후 복사

예 2: 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)
로그인 후 복사

2. 지원되는 문자 순서 확인

마찬가지로 MYSQL에서 지원하는 문자 순서는 다음과 같은 방법으로 확인할 수 있습니다.

방법 1: 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 |
...略
로그인 후 복사

방법 2: 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. 문자 순서의 명명 사양

문자 순서의 명명에는 아래와 같이 해당 문자 세트가 앞에 붙습니다. 예를 들어, 문자 시퀀스 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)
로그인 후 복사

4. 서버 문자 집합 및 문자 순서

목적: 데이터베이스를 생성하고 문자 집합이나 문자 순서를 지정하지 않으면 서버 문자 집합과 서버 문자 순서가 기본 문자 집합 및 정렬로 사용됩니다. 데이터베이스 규칙의.

지정 방법: MySQL 서비스가 시작되면 명령줄 매개변수를 통해 지정할 수 있습니다. 구성 파일의 변수를 통해 지정할 수도 있습니다.

서버 기본 문자 집합 및 문자 순서: MySQL을 컴파일할 때 컴파일 매개변수를 통해 지정됩니다.

character_set_server 및 collation_server는 각각 서버 문자 집합 및 서버 문자 시퀀스에 해당합니다.

1. 두 개의 시스템 변수 Character_set_server 및 collation_server에 각각 해당하는 서버 문자 집합 및 문자 시퀀스

를 확인하세요.

mysql> SHOW VARIABLES LIKE "character_set_server";
mysql> SHOW VARIABLES LIKE "collation_server";
로그인 후 복사

2. 서비스 시작 시 지정

MySQL 서비스 시작 시 서버 문자 집합과 문자 시퀀스를 지정할 수 있습니다. 지정하지 않을 경우 기본 문자 시퀀스는 각각 latin1 및 latin1_swedish_ci입니다. 이때 서버 문자 집합은 latin1의 기본 문자 시퀀스 latin1_swedish_ci입니다.

mysqld --character-set-server=latin1 \
 --collation-server=latin1_swedish_ci
로그인 후 복사

3. 구성 파일 사양

명령줄 매개변수에 지정하는 것 외에도 아래와 같이 구성 파일에 지정할 수도 있습니다.

mysqld --character-set-server=latin1
로그인 후 복사

4. 런타임 수정

예: 런타임 수정(다시 시작하면 무효화됩니다. 다시 시작한 후에도 변경되지 않고 유지하려면 구성 파일에 적어야 합니다.)

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校对集)

위 내용은 5분 만에 MySQL 문자 집합 설정 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!