이 글에서는 주로 mysql 문자셋의 개념과 연관성, 문자순서를 소개하고, MYSQL에서 지원하는 문자셋을 보는 다양한 방법을 공유합니다. 구체적인 내용은 이 글을 참고해 주시길 바라며, 도움이 되셨으면 좋겠습니다.
MySQL을 사용하는 과정에서는 문자 집합과 문자 순서의 개념뿐만 아니라 다양한 설정이 데이터 저장 및 비교에 미치는 영향을 이해하는 것이 매우 중요합니다. 많은 학생들이 일상 업무에서 직면하는 "깨진" 문제는 문자 집합과 문자 순서에 대한 부적절한 이해 또는 잘못된 설정으로 인해 발생할 가능성이 높습니다.
이 기사에서는 다음 내용을 얕은 것부터 깊은 것까지 소개합니다.
문자 집합과 문자 시퀀스의 기본 개념과 연결
MySQL에서 지원하는 문자 집합 및 문자 시퀀스 설정 수준과 연결 각 설정 수준 사이
서버, 데이터베이스, 테이블, 열 수준 문자 집합 및 문자 순서 보기 및 설정
문자 집합 및 문자 순서를 언제 설정해야 합니까
데이터 저장 측면에서 MySQL은 다양한 문자 집합 지원을 제공합니다. 데이터 비교 작업을 위해 다양한 문자 순서 지원이 제공됩니다.
MySQL은 서버 수준, 데이터베이스 수준, 테이블 수준, 열 수준 등 다양한 수준의 설정을 제공하므로 매우 정확한 설정을 제공할 수 있습니다.
문자셋과 문자순서는 무엇인가요? 간단히 말하면:
문자 집합(character set): 문자 및 문자 인코딩을 정의합니다.
문자 순서(조합): 문자의 비교 규칙을 정의합니다.
예:
에는 A, B, a, b라는 네 개의 문자가 있습니다. 이 네 문자의 코드는 A = 0, B = 1, a = 2, b = 3입니다. 여기서 문자 + 인코딩은 문자 세트를 구성합니다.
두 글자의 크기를 비교하고 싶다면 어떻게 해야 할까요? 예를 들어, A, B 또는 a, b를 비교하는 가장 직관적인 방법은 해당 인코딩을 사용하는 것입니다. 예를 들어 0
또한 A와 a의 경우 인코딩은 다르지만 대문자와 소문자는 동일해야 한다고 생각합니다. 즉, A == a입니다.
위에서는 두 가지 비교 규칙이 정의되어 있으며 이러한 비교 규칙의 집합이 대조입니다.
대문자와 소문자 모두인 경우 인코딩 크기를 비교하세요.
두 문자가 대소문자 관계에 있으면 동일합니다.
MySQL은 여러 문자 세트 및 문자 시퀀스를 지원합니다.
문자 집합은 하나 이상의 문자 시퀀스(보통 1~다)에 해당합니다.
두 개의 서로 다른 문자 세트는 동일한 문자 순서를 가질 수 없습니다.
각 문자 집합에는 기본 문자 순서가 있습니다.
위 내용은 비교적 추상적입니다. 무슨 일이 일어나고 있는지 이해하기 위해 다음 몇 가지 섹션을 살펴보겠습니다.
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)
목적: 데이터베이스를 생성하고 문자 집합이나 문자 순서를 지정하지 않으면 서버 문자 집합과 서버 문자 순서가 기본 문자 집합 및 정렬로 사용됩니다. 데이터베이스 규칙의.
지정 방법: 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
用途:指定数据库级别的字符集、字符序。同一个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为准。
创建表、修改表的语法如下,可通过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均未明确,则采用数据库的字符集、字符序设置。
类型为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中字符集、字符序相关的内容,这部分内容主要针对的是数据的存储与比较。其实还有很重要的一部分内容还没涉及:针对连接的字符集、字符序设置。
由于连接的字符集、字符序设置不当导致的乱码问题也非常多,这部分内容展开来讲内容也不少,放在下一篇文章进行讲解。
相关推荐:
위 내용은 5분 만에 MySQL 문자 집합 설정 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!