programing

utf8_general_ci와 utf8_unicode_ci의 차이점은 무엇입니까?

sourcetip 2022. 9. 19. 22:25
반응형

utf8_general_ci와 utf8_unicode_ci의 차이점은 무엇입니까?

★★★ utf8_general_ci ★★★★★★★★★★★★★★★★★」utf8_unicode_ci포먼 면면 ?? ?? ???

2020년 이후에 이 질문에 아직 도달하는 사람들에게는 이 두 가지보다 나은 새로운 선택지가 있을 수 있다.예를들면,utf8_unicode_520_ci.

이러한 조합은 모두 UTF-8 문자 부호화용입니다.차이점은 텍스트 정렬 및 비교 방법에 있습니다.

_unicode_ci ★★★★★★★★★★★★★★★★★」_general_ci텍스트 정렬 및 비교에 관한 두 가지 다른 규칙 세트입니다.에서는 MySQL과 같은 됩니다._unicode_520_ci 5한 규칙 또는 8.x 고유의 Unicode 5.2에 한 MySQL 8.x의 _0900_ai_ci 9한 규칙(및 대응하는 Unicode 9.0이 경우)_general_ci 계신 아마 이런 하나를 할 것 같아요._unicode_ci ★★★★★★★★★★★★★★★★★」_general_ci아래의 오래된 조합에 대한 설명은 참고용으로만 제공됩니다.

MySQL은 현재 결함이 있는 오래된 UTF-8 구현에서 벗어나고 있습니다.지금으로서는,utf8mb4utf8문자 부호화 부분에 대해서는, 고정 버전을 입수할 수 있도록 해 주세요.이전 버전과의 호환성을 위해 결함이 있는 버전은 권장되지 않지만 남아 있습니다.

주요 차이점

  • utf8mb4_unicode_ci는 범용 정렬 및 비교를 위한 공식 Unicode 규칙에 따라 다양한 언어로 정확하게 정렬됩니다.

  • utf8mb4_general_ci는, 속도를 향상시키기 위해서 설계된 쇼트 컷을 많이 사용하면서, 가능한 한 잘 할 수 있도록 하는 것을 목적으로 하는, 간단한 정렬 룰 세트입니다.Unicode 규칙을 따르지 않기 때문에 특정 언어 또는 문자를 사용하는 경우 등 일부 상황에서 바람직하지 않은 정렬 또는 비교가 발생합니다.

    최신 서버에서는 이러한 성능 향상은 거의 무시할 수 있습니다.이는 서버가 오늘날의 컴퓨터 CPU 성능의 극히 일부였던 시대에 고안되었습니다.

utf8mb4_unicode_ci에 걸쳐서utf8mb4_general_ci

utf8mb4_unicode_ci유니코드입니다.다양한 언어 및 다양한 특수문자를 사용할 경우 올바른 정렬을 위해 상당히 복잡한 알고리즘을 사용합니다.이러한 규칙은 언어 고유의 규칙을 고려해야 합니다.모든 사람이 알파벳 순서로 문자를 정렬하는 것은 아닙니다.

한, 된 유니코드 은 큰 .utf8mb4_general_ciMySQL my my my my 。

  • 를 들어, 유니코드 에서는, 와 같이 「와 「OE」와 같이 만, 「Unicode」는 「ss」의 「OE」를 사용합니다.utf8mb4_general_ci는 이들을 단일 문자(각각 "s" 및 "e"와 같이)로 정렬합니다.

  • 일부 Unicode 문자는 무시할 수 없는 것으로 정의되어 있습니다.즉, 정렬 순서에 세어서는 안 되며 대신 다음 문자로 비교가 진행됩니다. utf8mb4_unicode_ci는 이것들을 적절히 처리합니다.

아시아 언어나 알파벳이 다른 언어와 같은 라틴어가 아닌 언어에서는 유니코드 정렬과 단순화된 언어 사이에 훨씬 더 많은 차이가 있을 수 있습니다.utf8mb4_general_ci★★★★적합성utf8mb4_general_ci사용하는 언어에 크게 의존합니다.일부 언어에서는 상당히 불충분할 수 있습니다.

뭘로 할까요?

쓸 .utf8mb4_general_ciCPU 속도가 너무 낮아 성능 차이가 중요하기 때문에 더 이상 문제가 되지 않습니다.데이터베이스는 이와 같은 다른 병목 현상에 의해 제한될 것이 거의 확실합니다.

과거에 어떤 사람들은 이것을 사용하는 것을 추천했다.utf8mb4_general_ci정확한 정렬이 퍼포먼스 비용을 정당화할 만큼 중요할 때를 제외하곤 말이죠.오늘날 이러한 성능 비용은 거의 사라졌고 개발자들은 국제화를 더욱 심각하게 다루고 있습니다.

정확성보다 속도가 더 중요하다면 분류를 전혀 하지 않는 편이 낫다는 주장이 있다.정확성이 필요하지 않으면 알고리즘을 더 빠르게 만드는 것은 간단합니다.so,는,utf8mb4_general_ci속도나 정확성 등의 이유로 필요하지 않은 절충안입니다.

또 하나 덧붙이자면, 어플리케이션이 영어만을 지원한다고 해도, 다른 언어에서 사용되는 문자를 올바르게 정렬하는 것이 중요한 경우가 많은, 다른 사람의 이름을 취급할 필요가 있는 경우가 있습니다.모든 일에 유니코드 규칙을 사용하는 것은 매우 똑똑한 유니코드 사람들이 제대로 정렬하기 위해 매우 열심히 노력했다는 안심을 더하는 데 도움이 됩니다.

부품의 의미

은은 firstlyci대소문자를 구분하지 않는 정렬 및 비교용입니다.즉, 텍스트 데이터에 적합하며 대소문자는 중요하지 않습니다.다른 유형의 대조는 다음과 같습니다.cs구분하고, 대소문자가 중요한 텍스트 데이터의 경우 대소문자를 구분합니다.bin부호화가 일치할 필요가 있는 경우, 비트간(bit-for-bit)으로, 실제로 부호화된 바이너리 데이터(Base64 등)의 필드에 적합합니다.대소문자를 구분하는 정렬로 인해 몇 가지 이상한 결과가 발생하고 대소문자를 구분하는 비교로 인해 대소문자를 구분하는 중복 값이 발생할 수 있습니다.따라서 대소문자를 구분하는 대조는 텍스트 데이터에서 선호되지 않습니다..더 적절할 것 같습니다.

다음 분.unicode또는general는 특정 정렬 및 비교 규칙, 특히 텍스트를 정규화 또는 비교하는 방법을 나타냅니다.utf8mb4 문자 인코딩에는 다양한 규칙 세트가 있습니다.unicode그리고.general하나의 특정 언어가 아닌 모든 가능한 언어로 잘 작동하려고 노력하는 두 가지입니다.이 두 가지 규칙 집합 간의 차이가 이 답변의 주제입니다.주의:unicode는 Unicode 4.0 규칙을 사용합니다.MySQL 및 MariaDB의 최신 버전에서 규칙 집합 추가unicode_520유니 코드 5.2, MySQL에서 규칙을 사용하여 8.x을 추가한다.0900유니 코드 9.0에서 규칙을 사용하여(그"unicode_"부분이 떨어져서 고민).

그리고 마지막으로,utf8mb4-코스는 문자 인코딩 내부적으로 사용된다.이 대답에서는 나는 오직 유니 코드 기반 인코딩에 대해서 말합니다.

내가 사용하는 것 사이의 성능 차이를 알고 싶었다.utf8_general_ci그리고.utf8_unicode_ci나는 혼자서 벤치 마크를 만들기로 결심했어, 하지만, 저는 어떤 벤치 마크는 인터넷에 나열되어 있지 않았다.

나는:50만 있는 매우 간단한 도표를 만들었다.

CREATE TABLE test(
  ID INT(11) DEFAULT NULL,
  Description VARCHAR(20) DEFAULT NULL
)
ENGINE = INNODB
CHARACTER SET utf8
COLLATE utf8_general_ci;

그리고 저는 무작위 자료와 저장 프로시저 실행하여:시작했다.

CREATE PROCEDURE randomizer()
BEGIN
  DECLARE i INT DEFAULT 0;
  DECLARE random CHAR(20) ;
  theloop: loop
    SET random = CONV(FLOOR(RAND() * 99999999999999), 20, 36);
    INSERT INTO test VALUES (i+1, random);
    SET i=i+1;
    IF i = 500000 THEN
      LEAVE theloop;
    END IF;
  END LOOP theloop;
END

그리고 다음과 같은 절차도 간편하게 저장된를 만들었다.SELECT,SELECT와 함께LIKE, 분류(SELECT와 함께ORDER BY):

CREATE PROCEDURE benchmark_simple_select()
BEGIN
  DECLARE i INT DEFAULT 0;
  theloop: loop
    SELECT *
    FROM test
    WHERE Description = 'test' COLLATE utf8_general_ci;
    SET i = i + 1;
    IF i = 30 THEN
      LEAVE theloop;
    END IF;
  END LOOP theloop;
END;

CREATE PROCEDURE benchmark_select_like()
BEGIN
  DECLARE i INT DEFAULT 0;
  theloop: loop
    SELECT *
    FROM test
    WHERE Description LIKE '%test' COLLATE utf8_general_ci;
    SET i = i + 1;
    IF i = 30 THEN
      LEAVE theloop;
    END IF;
  END LOOP theloop;
END;

CREATE PROCEDURE benchmark_order_by()
BEGIN
  DECLARE i INT DEFAULT 0;
  theloop: loop
    SELECT *
    FROM test
    WHERE ID > FLOOR(1 + RAND() * (400000 - 1))
    ORDER BY Description COLLATE utf8_general_ci LIMIT 1000;
    SET i = i + 1;
    IF i = 10 THEN
      LEAVE theloop;
    END IF;
  END LOOP theloop;
END;

보관된 절차 위에서.utf8_general_ci정렬이지만 두 사용한 시험의 과정 동안에 사용된다.utf8_general_ci그리고.utf8_unicode_ci.

5번 각 조합(5번 각 저장 프로시저라고 불렀다.utf8_general_ci5회분utf8_unicode_ci평균값을 계산했습니다.

결과는 다음과 같습니다.

benchmark_simple_select()

  • 와 함께utf8_general_ci: 9,957 밀리초
  • 와 함께utf8_unicode_ci: 10,271 밀리초

이 벤치마크에서는utf8_unicode_ci보다 느리다utf8_general_ci3.2% 증가했습니다.

benchmark_select_like()

  • 와 함께utf8_general_ci: 11,441 밀리초
  • 와 함께utf8_unicode_ci: 12,811 밀리초

이 벤치마크에서는utf8_unicode_ci보다 느리다utf8_general_ci12%.

benchmark_order_by()

  • 와 함께utf8_general_ci: 11,944 밀리초
  • 와 함께utf8_unicode_ci: 12,887 밀리초

이 벤치마크에서는utf8_unicode_ci보다 느리다utf8_general_ci7.9% 증가했습니다.

게시물은 그것을 매우 잘 묘사하고 있다.

요컨대:utf8_unicode_ci는 Unicode 표준에 정의된 Unicode 대조 알고리즘을 사용하는데 반해,utf8_general_ci는 보다 단순한 정렬 순서이므로 "정확도가 낮은" 정렬 결과를 얻을 수 있습니다.

mysql 매뉴얼의 Unicode 문자 집합 섹션을 참조하십시오.

Unicode 문자 집합의 경우 _general_ci 조회를 사용하여 수행되는 작업은 _unicode_ci 조회를 사용하는 작업보다 빠릅니다.예를 들어 utf8_general_ci 대조 비교는 utf8_unicode_ci 비교보다 빠르지만 정확도는 약간 낮습니다.그 이유는 utf8_unicode_ci가 확장 등의 매핑을 지원하기 때문입니다.즉, 어떤 문자가 다른 문자의 조합과 동등한 경우입니다.예를 들어 독일어 및 기타 언어에서 """은 "ss"와 같다.utf8_ci는 축소와 무시 가능한 문자도 지원합니다.utf8_general_ci는 확장, 축소 또는 무시할 수 없는 문자를 지원하지 않는 레거시 조합입니다.문자 간 일대일 비교만 가능합니다.

요약하면 utf_general_ci는 전체 표준을 구현해야 하는 utf_unicode_ci보다 더 작고 덜 정확한 비교 세트를 사용합니다.general_ci 집합은 연산 작업이 적기 때문에 더 빠릅니다.

간단히 말하면:

더 나은 정렬 순서가 필요한 경우 - 사용utf8_unicode_ci(이것은 권장되는 방법입니다),

하지만 퍼포먼스에 완전히 관심이 있다면 - 사용utf8_general_ci다만, 조금 구식인 것을 알고 있습니다.

성능의 차이는 매우 미미합니다.

일부 상세(PL)

여기읽을 수 있듯이(Peter Gulutzan) 폴란드 문자 "WW"(L with stroke - html esc: 스트로크 포함) 정렬/비교에는 차이가 있습니다.Ł)(소문자: "w" - html esc:ł) - 다음과 같은 전제가 있습니다.

utf8_polish_ci      Ł greater than L and less than M
utf8_unicode_ci     Ł greater than L and less than M
utf8_unicode_520_ci Ł equal to L
utf8_general_ci     Ł greater than Z

광택어 문자Ł편지 뒤에 있다L그리고 그 전에M. 이 코드 중 어느 것도 더 낫거나 더 나쁘지는 않습니다.필요에 따라 다릅니다.

정렬과 문자 매칭에는 두 가지 큰 차이가 있습니다.

정렬:

  • utf8mb4_general_ci모든 액센트를 삭제하고 하나씩 정렬하면 잘못된 정렬 결과가 생성될 수 있습니다.
  • utf8mb4_unicode_ci정확하게 정렬합니다.

문자 매칭

그들은 글자를 다르게 일치시킨다.

예를 들어,utf8mb4_unicode_ci당신은 가지고 있다i != ı단,utf8mb4_general_ci버틸 수 있다ı=i.

예를 들어, 다음과 같이 말다툼을 한다고 가정해 봅시다.name="Yılmaz".그리고나서

select id from users where name='Yilmaz';

collocation이 다음과 같은 경우 행을 반환합니다.utf8mb4_general_ci단, 와 함께 배치되어 있는 경우utf8mb4_unicode_ci행이 반환되지 않습니다!

반면에 우리는 그것을 가지고 있다.a=ª그리고.ß=ssutf8mb4_unicode_ci에서는 그렇지 않다utf8mb4_general_ci그러니까 네가 그 여자랑 싸웠다고 상상해봐.name="ªßi",그리고나서

select id from users where name='assi';

collocation이 다음과 같은 경우 행을 반환합니다.utf8mb4_unicode_ci단, collocation이 로 설정되어 있는 경우 행을 반환하지 않습니다.utf8mb4_general_ci.

각 코로케이션에 대한 전체 일치 목록은 여기에서 찾을 수 있습니다.

이 투고에 따르면 MySQL 5.7에서는 utf8mb4_mb4_general_ci 대신 utf8mb4_general_ci를 사용하면 상당한 성능상의 이점이 있습니다.https://www.percona.com/blog/2019/02/27/charset-and-collation-settings-impact-on-mysql-performance/

언급URL : https://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci

반응형