[mysql] my.cnf에서 MySQL 기본 문자 세트를 UTF-8로 변경 하시겠습니까?

현재 우리는 응용 프로그램에서 문자 세트를 UTF-8 로 설정하기 위해 PHP에서 다음 명령을 사용하고 있습니다.

이것은 약간의 오버 헤드이므로 MySQL의 기본 설정으로 설정하고 싶습니다. /etc/my.cnf 또는 다른 위치에서이 작업을 수행 할 수 있습니까?

SET NAMES 'utf8'
SET CHARACTER SET utf8

/etc/my.cnf에서 기본 문자 집합을 찾았지만 문자 집합에 대한 내용은 없습니다.

이 시점에서 MySQL charset 및 collation 변수를 UTF-8로 설정하기 위해 다음을 수행했습니다.

skip-character-set-client-handshake
character_set_client=utf8
character_set_server=utf8

이것이 올바른 처리 방법입니까?



답변

기본값을 UTF-8로 설정하려면 my.cnf에 다음을 추가하려고합니다.

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8


[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

기존 DB의 문자 집합을 변경하려면 알려주십시오 … 질문에 직접 지정하지 않았으므로 원하는 것인지 확실하지 않습니다.


답변

최신 버전의 MySQL의 경우

default-character-set = utf8

문제를 일으킨다. 내가 생각하는 더 이상 사용되지 않습니다.

Justin Ball 이 ” MySQL 5.5.12로 업그레이드하면 MySQL이 시작되지 않습니다 “에서 다음과 같이 말합니다 .

  1. 그 지시를 제거하면 좋을 것입니다.

  2. 그런 다음 구성 파일 (예 : ‘/etc/my.cnf’)은 다음과 같아야합니다.

    [mysqld]
    collation-server = utf8_unicode_ci
    init-connect='SET NAMES utf8'
    character-set-server = utf8
  3. MySQL을 다시 시작하십시오.

  4. MySQL이 UTF-8인지 확인하려면 MySQL 프롬프트에서 다음 쿼리를 실행하십시오.

    • 첫 번째 질문 :

       mysql> show variables like 'char%';

      출력은 다음과 같아야합니다.

       +--------------------------+---------------------------------+
       | Variable_name            | Value                           |
       +--------------------------+---------------------------------+
       | character_set_client     | utf8                            |
       | character_set_connection | utf8                            |
       | character_set_database   | utf8                            |
       | character_set_filesystem | binary                          |
       | character_set_results    | utf8                            |
       | character_set_server     | utf8                            |
       | character_set_system     | utf8                            |
       | character_sets_dir       | /usr/local/mysql/share/charsets/|
       +--------------------------+---------------------------------+
    • 두 번째 질문 :

       mysql> show variables like 'collation%';

      그리고 쿼리 출력은 다음과 같습니다.

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

답변

이 질문에는 이미 많은 답변이 있지만 Mathias Bynens는 더 나은 UTF-8 지원을 위해 ‘utf8’대신 ‘utf8mb4’를 사용해야한다고 언급했습니다 ( ‘utf8’은 4 바이트 문자를 지원하지 않으며 필드는 삽입시 잘립니다) ). 나는 이것이 중요한 차이점이라고 생각합니다. 기본 문자 세트와 데이터 정렬을 설정하는 방법에 대한 또 다른 대답이 있습니다. 똥 더미 (💩)를 넣을 수있는 것.

이것은 MySQL 5.5.35에서 작동합니다.

일부 설정은 선택 사항 일 수 있습니다. 내가 잊어 버린 것을 완전히 확신하지 못하므로이 답변을 커뮤니티 위키로 만들 것입니다.

이전 설정

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| 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/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+
3 rows in set (0.00 sec)

구성

# 💩 𝌆
# UTF-8 should be used instead of Latin1. Obviously.
# NOTE "utf8" in MySQL is NOT full UTF-8: http://mathiasbynens.be/notes/mysql-utf8mb4

[client]
default-character-set = utf8mb4

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set = utf8mb4

새로운 설정

mysql> SHOW VARIABLES LIKE 'char%'; SHOW VARIABLES LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_unicode_ci |
| collation_server     | utf8mb4_unicode_ci |
+----------------------+--------------------+
3 rows in set (0.00 sec)

character_set_system 은 항상 utf8 입니다.

기존 테이블에는 영향을 미치지 않으며 기본 설정일뿐입니다 (새 테이블에 사용). 다음 ALTER 코드 를 사용하여 기존 테이블을 변환 할 수 있습니다 (덤프 복원 해결 방법 없음).

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

편집하다:

MySQL 5.0 서버에서 : character_set_client, character_set_connection, character_set_results, collation_connection은 latin1로 유지됩니다. 발행 SET NAMES utf8(해당 버전에서는 사용할 수없는 utf8mb4)도 utf8로 설정됩니다.


주의 사항 : VARCHAR (255) 유형의 인덱스 열이있는 utf8 테이블이있는 경우 최대 키 길이가 초과되어 경우에 따라 변환 할 수 없습니다 ( Specified key was too long; max key length is 767 bytes.). 가능하면 열 크기를 255에서 191로 줄이십시오 (191 * 4 = 764 <767 <192 * 4 = 768). 그런 다음 테이블을 변환 할 수 있습니다.


답변

MySQL 5.5에서는 my.cnf에 있습니다.

[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

결과는

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database   | utf8_unicode_ci |
| collation_server     | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)


답변

참고 :
my.cnf 파일은 다음 위치에 있습니다./etc/mysql/

이 줄을 추가 한 후 :

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
skip-character-set-client-handshake

[client]
default-character-set   = utf8

[mysql]
default-character-set   = utf8

서버를 다시 시작하는 것을 잊지 마십시오 :

sudo service mysql restart


답변

NijaCat은 가까웠지만 과잉 행동을 지정했습니다.

기본값을 UTF-8로 설정하려면 my.cnf에 다음을 추가하려고합니다.

[client]
default-character-set=utf8

[mysqld]
default-character-set = utf8

그런 다음 확인하십시오.

mysql> show variables like "%character%";show variables like "%collation%";

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)


답변

또한 제목 default-character-set = utf8아래에 설정 한 후에 [mysqld]MySQL 5.5.x가 Ubuntu 12.04 (Precise Pangolin) 에서 시작되지 않는다는 것을 알았습니다 .