저수준에서 Wordpress가 MySQL 문자 세트 및 데이터 정렬에서 작동하는 방식을 설명하십시오.


10

질문 제목에서 알 수 있듯이 Wordpress가 MySQL 문자 집합 및 데이터 정렬 옵션과 어떻게 작동하는지 이해하고 싶습니다. 아래에서 볼 수 있듯이, 나에게는별로 이해가되지 않습니다 ...

설치 페이지의 지침에 따라 Wordpress를 설치했습니다.

https://codex.wordpress.org/Installing_WordPress

지침의 일부로, 나는 커맨드 라인에서 MySQL 데이터베이스를 수동으로 생성하는 것에 대한 조언, 즉 명령을 따랐습니다.

mysql> CREATE DATABASE databasename;
Query OK, 1 row affected (0.00 sec)

mysql> GRANT ALL PRIVILEGES ON databasename.* TO "wordpressusername"@"hostname"
-> IDENTIFIED BY "password";
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.01 sec)

mysql> EXIT

또한 지시에 따라 UTF-8 문자 세트를 사용하도록 "wp-config.php"파일을 편집했습니다.

define( 'DB_CHARSET', 'utf8' );

데이터 정렬 설정을 비워 두었습니다.

define( 'DB_COLLATE', '' );

재미가 시작되는 곳은 다음과 같습니다.

  1. MySQL UTF-8의 일부는 아니지만 𝌆와 같은 UTF-8 MB4의 일부인 문자를 게시물에 입력하면 렌더링 된 페이지에 올바르게 표시됩니다. 문자 세트를 UTF-8 MB4로 설정하지 않았지만 더 제한적인 UTF-8 (물론 MySQL에서 정의 한대로 일반적으로 이해되지는 않음)으로 인해이가 발생하지 않을 것으로 예상했습니다.

  2. 커맨드 라인에서 MySQL의 문제를 조사하면 더 이상해집니다. 을 실행 show variables like 'char%';하면 다음과 같은 응답이 나타납니다.

    +--------------------------+----------------------------+
    | Variable_name            | Value                      |
    +--------------------------+----------------------------+
    | character_set_client     | utf8                       |
    | character_set_connection | utf8                       |
    | character_set_database   | latin1                     |
    | character_set_filesystem | binary                     |
    | character_set_results    | utf8                       |
    | character_set_server     | latin1                     |
    | character_set_system     | utf8                       |
    | character_sets_dir       | /usr/share/mysql/charsets/ |
    +--------------------------+----------------------------+

데이터베이스 문자 세트는 latin1이 아닌 UTF-8로 예상되었습니다.

  1. 명령을 실행하면 show variables like 'collation%';출력은 다음과 같습니다.

    +----------------------+-------------------+
    | Variable_name        | Value             |
    +----------------------+-------------------+
    | collation_connection | utf8_general_ci   |
    | collation_database   | latin1_swedish_ci |
    | collation_server     | latin1_swedish_ci |
    +----------------------+-------------------+

명백한 이유로 (아직 UTF-8 데이터베이스에서 기본 latin1_swedish_ci 데이터 정렬을 기대하지 않았을 수도 있음) 그것은 낯선 일입니다.

  1. 마지막으로을 실행 show full columns from mywpdatabase.wp_posts;하면 값이 NULL이 아닌 출력 행이 데이터 정렬을 다음과 같이 표시합니다.

| post_content_filtered | longtext | utf8mb4_unicode_ci |

내 질문은 다음과 같습니다-어떻게 설명 할 수 있습니까? 데이터베이스가 구성에서 UTF-8로 정의 된 경우 Wordpress 설치에서 UTF-8 MB4 문자를 올바르게 렌더링하는 이유는 무엇입니까? 왜 데이터베이스가 MySQL에서 UTF-8 대신 latin1, 스웨덴어 데이터 정렬로 표시됩니까? 그리고이 모든 것에도 불구하고 테이블의 개별 필드는 utf8mb4_unicode_ci입니까? Wordpress가 MySQL에서 작동하는 방식에 대한 저수준 설명은 매우 유용합니다. 감사합니다!

답변:


11

WordPress 웹 사이트의 wp-config.php에는 두 가지 정의가 있습니다.

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

가장 일반적으로 오해되는 몇 가지가 있습니다. 이러한 정의에서 상수의 이름은 데이터베이스 자체와 관련이 있음을 시사합니다. 그들은 아닙니다. 데이터베이스 내의 테이블과 관련이 있습니다.

데이터베이스 생성은 테이블 생성과 완전히 독립적입니다. WordPress는 데이터베이스를 만들지 않으며 데이터베이스에 연결할 수있는 한 데이터베이스의 기본 문자 집합 및 데이터 정렬을 신경 쓰지 않습니다.

첫 번째 정의에서 'utf8'값은 'utf8'또는 'utf8mb4'인 'utf8'패밀리에서 최소 제한 문자 세트를 의미합니다.

위의 정의를 변경하지 않은 채 웹 사이트를 설치하기 전에 MySQL의 MySQL (MySQL 버전에 따라)에서 지원되며 제한이 가장 적은 데이터베이스 테이블 문자 세트 및 데이터 정렬과 관련하여 자체적으로 선택하도록 WordPress에 지시하는 것과 같습니다.

다음은 WordPress가 설치 중에 선택을 결정하기 위해 분석하는 것입니다.

  • MySQL의 버전
  • 데이터베이스의 데이터 정렬 (wp-config.php에서)

MySQL 버전에 따라 WordPress는 사용할 utf8 제품군 그룹을 결정 합니다. utf8utf8mb4 이름으로 구별되는 두 가지가 있습니다 . utf8 그룹의 문자 세트 는 최대 3 바이트 길이의 문자를 저장할 수 있습니다. utf8mb4 그룹의 문자 세트 는 최대 4 바이트 길이의 문자를 저장할 수 있습니다.

이제 워드 프레스는 DB_COLLATE 정의 값을 확인합니다 . 비어 있으면 선택한 utf8 제품군 에서 최소 제한 조합을 사용하고 그렇지 않으면 지정된 값을 사용합니다.

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', '');

MySQL이 utf8mb4 (이전 버전)를 지원하지 않으면 테이블 문자 세트는 utf8이 되고 데이터 정렬은 utf8_general_ci가 됩니다. 그렇지 않으면 utf8mb4utf8mb4_unicode_520_ci 또는 utf8mb4_unicode_ci (MySQL 버전에 따라 다름)를 각각 기대할 수 있습니다 .

define('DB_CHARSET', 'utf8');
define('DB_COLLATE', 'utf8_polish_ci');

이전 MySQL 버전 - UTF8utf8_polish_ci . 최신 MySQL 버전 -utf8mb4utf8mb4_polish_ci ( _polish_ci 접미사가 적용됨 )

define('DB_CHARSET', 'cp1250');
define('DB_COLLATE', 'cp1250_polish_ci');

모든 MySQL 버전 - CP1250cp1250_polish_ci .

define('DB_CHARSET', 'cp1250');
define('DB_COLLATE', 'utf8_general_ci');

모든 MySQL 버전-오류 (문자 세트와 데이터 정렬이 일치하지 않음)

요약

대부분의 경우 위에서 설명한 정의 값을 변경하지 않고 그대로 두는 것이 좋습니다. 그러나 테이블 데이터 정렬이 웹 사이트의 언어와 일치하도록하려면 DB_COLLATE define 의 값을 적절하게 수정할 수 있습니다 (예 : utf8mb4_polish_ci ).

참고 : 𝌆 문자가 올바르게 저장되고 검색 된 이유를 설명합니다. 간단히, 테이블 문자 세트는 utf8이 아닌 utf8mb4 그룹 에 속합니다 .


1
Wordpress에서 데이터 정렬을 설정하는 방법을 설명해 주셔서 감사하지만 나머지 부분은 다루지 않았습니다. UTF-8 문자 세트가 정의 된 경우 MySQL이 데이터베이스를 latin1로 표시하는 이유는 무엇입니까? 왜 데이터베이스 데이터 정렬이 스웨덴어로 표시됩니까? 또한 문자 집합과 데이터 정렬이 혼란스러워 보입니다. 데이터 정렬은 문자 집합이 아닌 순서, 비교 규칙 만 정의합니다. 따라서 어떤 조합이 사용 되든 UTF-8이 문자 세트 인 경우 외부의 문자 (더 좁은 MySQL 의미로 정의 됨)는 렌더링되지 않아야합니다.
X-Mann

프로세스를보다 명확하게 설명하기 위해 답변을 업데이트하겠습니다.
Frank P.

1
업데이트 해 주셔서 감사합니다! 나는 당신의 대답을 받아 들였습니다. 문제는 MySQL과 관련이 있으며 전문 지식이 부족합니다. 테이블 자체가 데이터베이스보다 더 넓은 문자 집합을 사용할 수 있다는 것을 몰랐습니다. 이 새로운 정보는 마음을 편안하게 해주었다. MySQL의 기본 문자 집합을 변경할 필요가 없으며 Wordpress가 테이블 수준에서 처리합니다.
X-Mann

아니에요. 도움이되어서 다행입니다.
Frank P. Walentynowicz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.