>일반적인 문제 >mysql에서 대조는 무엇을 의미합니까?

mysql에서 대조는 무엇을 의미합니까?

百草
百草원래의
2023-07-11 14:32:313292검색

MySQL의 collate는 collation set을 의미하는데, 이는 정렬 규칙으로 이해될 수 있습니다. MySQL에서 저장된 문자 데이터는 사용된 문자 세트 및 대조 규칙에 따라 서로 다른 대조를 가질 수 있습니다. 문자 세트는 저장할 수 있는 문자 유형을 결정하고 대조 규칙은 해당 문자가 정렬되는 방식을 결정합니다.

mysql에서 대조는 무엇을 의미합니까?

이 튜토리얼의 운영 체제: Windows 10 시스템, mysql 버전 8.0, Dell G3 컴퓨터.

mysql COLLATE는 정렬 집합을 의미하며 정렬 규칙 등으로 이해될 수 있습니다.

MySQL에서 저장된 문자 데이터는 사용된 문자 세트 및 대조 규칙에 따라 서로 다른 대조를 가질 수 있습니다. 문자 세트는 저장할 수 있는 문자 유형을 결정하고 대조 규칙은 이러한 문자가 정렬되는 방식을 결정합니다.

일반적으로 데이터베이스나 테이블을 생성할 때 다양한 문자 집합과 조합 규칙을 지정하여 문자 데이터의 정렬 방법을 설정할 수 있습니다. 특정 대조 규칙이 지정되지 않은 경우 MySQL은 기본 대조 규칙을 사용합니다. 일반적인 문자 집합 및 대조 규칙에는 utf8mb4_general_ci(대소문자 구분, 악센트 구분 안 함), utf8mb4_unicode_ci(대소문자 구분, 악센트 구분) 등이 포함됩니다.

한 부씩 정렬 규칙의 선택은 특정 요구 사항에 따라 결정됩니다. 다양한 시나리오에 적합한 대조 규칙이 다릅니다. 예를 들어, 데이터를 검색하고 정렬할 때 일부 대조 규칙은 대소문자를 구분하여 비교를 수행하지만 다른 규칙은 그렇지 않습니다. 따라서 데이터베이스를 설계할 때 실제 요구 사항과 비즈니스 규칙을 기반으로 적절한 대조 규칙을 선택해야 합니다.

다양한 정렬 규칙을 사용하여 다양한 정렬 방법을 구현할 수 있습니다. 예를 들어 문자 데이터는 대소문자를 구분하지 않고 정렬할 수 있습니다. 즉, "A"와 "a"는 동일한 것으로 간주됩니다. 반대로 대소문자 구분 규칙을 사용하는 경우 "A"와 "a"는 다른 문자로 처리됩니다.

또한 대조 규칙은 문자열 비교 작업에도 영향을 미칠 수 있습니다. 서로 다른 대조 규칙에 따라 문자 간의 비교 결과가 다를 수 있습니다. 예를 들어, 일부 대조 규칙에서는 문자 "a"가 문자 "Z"보다 큰 것으로 간주될 수 있지만 다른 규칙에서는 그 반대가 적용됩니다.

대조 규칙은 문자 데이터 정렬 및 비교뿐만 아니라 문자열 함수 및 연산자가 쿼리에 사용될 때의 결과에도 적용된다는 점에 유의하는 것이 중요합니다. 따라서 SQL 쿼리를 작성할 때 예상 결과를 얻는 데 사용되는 대조 규칙을 고려해야 합니다.

mysql에서 show create table 명령을 실행하면 테이블의 생성문을 볼 수 있습니다.

CREATE TABLE `table1` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    `field1` text COLLATE utf8_unicode_ci NOT NULL COMMENT '字段1',
    `field2` varchar(128) COLLATE utf8_unicode_ci NOT NULL DEFAULT '' COMMENT '字段2',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8_unicode_ci;

대부분의 필드를 이해할 수 있지만 오늘 논의하고 싶은 내용은 다음과 같습니다. COLLATE 키워드. 이 값에 해당하는 utf8_unicode_ci는 무엇을 의미하나요? 인터뷰 중 DBA 테스트를 위해 이 질문을 사용한다면 대부분의 사람들이 당황할 수 있을 것입니다.

COLLATE는 어떤 용도로 사용되나요?

phpmyadmin을 사용하는 개발자는 중국어 헤더가 이미 답변을 제공했기 때문에 매우 친숙해 보일 수 있습니다.

mysql에서 대조는 무엇을 의미합니까?

소위 utf8_unicode_ci는 실제로 정렬에 사용되는 규칙입니다. VARCHAR, CHAR 및 TEXT 유형 열과 같은 mysql의 문자 유형 열의 경우 mysql에 열을 정렬하고 비교하는 방법을 알려주려면 COLLATE 유형이 필요합니다. 즉, COLLATE는 ORDER BY 문의 순서, WHERE 조건의 크거나 작은 기호, **DISTINCT**, **GROUP BY** 및 **HAVING*으로 결과를 필터링하는 순서에 영향을 미칩니다. * 쿼리 결과. 또한, MySQL이 인덱스를 구축할 때 인덱스 컬럼이 문자형이면 인덱스 생성에도 영향을 주지만 우리는 이러한 영향을 인지할 수 없습니다. 간단히 말해서, 문자 유형 비교나 정렬이 관련된 모든 것은 COLLATE와 관련됩니다.

다양한 COLLATE의 차이점

COLLATE은 일반적으로 데이터 인코딩(CHARSET)과 관련이 있습니다. 일반적으로 각 CHARSET에는 지원하는 여러 COLLATE가 있으며 각 CHARSET은 COLLATE를 기본값으로 지정합니다. 예를 들어, Latin1 인코딩의 기본 COLLATE는 latin1_swedish_ci이고, GBK 인코딩의 기본 COLLATE는 gbk_chinese_ci이며, utf8mb4 인코딩의 기본값은 utf8mb4_general_ci입니다.

여담으로 설명하겠습니다. mysql에는 utf8과 utf8mb4라는 두 가지 인코딩이 있습니다. mysql에서는 **utf8**을 잊어버리고 항상 **utf8mb4**를 사용하세요. 이는 MySQL의 레거시 문제입니다. MySQL의 UTF8은 최대 길이가 3바이트인 문자 인코딩만 지원할 수 있습니다. 4바이트를 차지해야 하는 일부 텍스트의 경우 MySQL의 UTF8은 이를 지원하지 않습니다.

많은 COLLATE에는 Case Insensitive의 약어인 _ci라는 단어가 있습니다. 이는 정렬 및 비교할 때 "A"와 "a"가 동일하게 처리된다는 의미입니다. field1="a"인 table1에서 선택 *은 field1의 값을 "A"로 선택할 수도 있습니다. 동시에 _cs 접미사가 있는 COLLATE의 경우 대소문자를 구분합니다.

在mysql中使用show collation指令可以查看到mysql所支持的所有COLLATE。以utf8mb4为例,该编码所支持的所有COLLATE如下图所示。

mysql에서 대조는 무엇을 의미합니까?

imgmysql中和utf8mb4相关的所有COLLATE

图中我们能看到很多国家的语言自己的排序规则。在国内比较常用的是utf8mb4_general_ci(默认)、utf8mb4_unicode_ci、utf8mb4_bin这三个。我们来探究一下这三个的区别:

首先utf8mb4_bin的比较方法其实就是直接将所有字符看作二进制串,然后从最高位往最低位比对。所以很显然它是区分大小写的。

而utf8mb4_unicode_ci和utf8mb4_general_ci对于中文和英文来说,其实是没有任何区别的。对于我们开发的国内使用的系统来说,随便选哪个都行。只是对于某些西方国家的字母来说,utf8mb4_unicode_ci会比utf8mb4_general_ci更符合他们的语言习惯一些,general是mysql一个比较老的标准了。例如,德语字母“ß”,在utf8mb4_unicode_ci中是等价于"ss"两个字母的(这是符合德国人习惯的做法),而在utf8mb4_general_ci中,它却和字母“s”等价。不过,这两种编码的那些微小的区别,对于正常的开发来说,很难感知到。本身我们也很少直接用文字字段去排序,退一步说,即使这个字母排错了一两个,真的能给系统带来灾难性后果么?从网上找的各种帖子讨论来说,更多人推荐使用utf8mb4_unicode_ci,但是对于使用了默认值的系统,也并没有非常排斥,并不认为有什么大问题。结论:推荐使用utf8mb4_unicode_ci,对于已经用了utf8mb4_general_ci的系统,也没有必要花时间改造。

另外需要注意的一点是,从mysql 8.0开始,mysql默认的CHARSET已经不再是Latin1了,改为了utf8mb4(参考链接),并且默认的COLLATE也改为了utf8mb4_0900_ai_ci。utf8mb4_0900_ai_ci大体上就是unicode的进一步细分,0900指代unicode比较算法的编号( Unicode Collation Algorithm version),ai表示accent insensitive(发音无关),例如e, è, é, ê 和 ë是一视同仁的。相关参考链接1,相关参考链接2

COLLATE设置级别及其优先级

设置COLLATE可以在示例级别、库级别、表级别、列级别、以及SQL指定。实例级别的COLLATE设置就是mysql配置文件或启动指令中的collation_connection系统变量。

库级别设置COLLATE的语句如下:

CREATE DATABASE DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
如果库级别没有设置CHARSET和COLLATE,则库级别默认的CHARSET和COLLATE使用实例级别的设置。在mysql8.0以下版本中,你如果什么都不修改,默认的CHARSET是Latin1,默认的COLLATE是latin1_swedish_ci。从mysql8.0开始,默认的CHARSET已经改为了utf8mb4,默认的COLLATE改为了utf8mb4_0900_ai_ci。

表级别的COLLATE设置,则是在CREATE TABLE的时候加上相关设置语句,例如:

CREATE TABLE (
 
……
 
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

如果表级别没有设置CHARSET和COLLATE,则表级别会继承库级别的CHARSET与COLLATE。

列级别的设置,则在CREATE TABLE中声明列的时候指定,例如  

CREATE TABLE (
 
`field1` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '',
 
……
 
) ……

如果列级别没有设置CHARSET和COLATE,则列级别会继承表级别的CHARSET与COLLATE。

最后,你也可以在写SQL查询的时候显示声明COLLATE来覆盖任何库表列的COLLATE设置,不太常用,了解即可:

SELECT DISTINCT field1 COLLATE utf8mb4_general_ci FROM table1;
 
SELECT field1, field2 FROM table1 ORDER BY field1 COLLATE utf8mb4_unicode_ci;

如果全都显示设置了,那么优先级顺序是 SQL语句 > 列级别设置 > 表级别设置 > 库级别设置 > 实例级别设置。也就是说列上所指定的COLLATE可以覆盖表上指定的COLLATE,表上指定的COLLATE可以覆盖库级别的COLLATE。如果没有指定,则继承下一级的设置。即列上面没有指定COLLATE,则该列的COLLATE和表上设置的一样。

以上就是关于mysql的COLLATE相关知识。不过,在系统设计中,我们还是要尽量避免让系统严重依赖中文字段的排序结果,在mysql的查询中也应该尽量避免使用中文做查询条件。

위 내용은 mysql에서 대조는 무엇을 의미합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.