안녕세계

[MySQL] MySQL character set encoding 변경 (utf8, utf8mb4) 본문

[MySQL] MySQL character set encoding 변경 (utf8, utf8mb4)

Junhong Kim 2018. 3. 29. 15:55
728x90
반응형

MySQL encoding 변경 (utf8, utf8mb4)

MySQL 기본 패키지는 character set 이 latin1 로 설정되어있습니다.
character set 을 utf8 로 설정하여 한글 및 다른 언어가 께지는 것을 처리해야합니다.
때로는 utf8mb4 로 설정하는 경우도 있는데 utf8mb4는 emoji를 데이터베이스에 저장할 수 있습니다.
emoji는 4byte 문자이기 때문에 utf8 의 상위 호환인 utf8mb4를 사용해야 저장할 수 있습니다.
NOTE: character set 이 utf8 인 상태에서 emoji를 데이터베이스 저장하려면 error가 발생합니다.

character set 확인

방법 (1)

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'c%';
+--------------------------+------------------------------------------------------+
| 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/local/Cellar/mysql/5.7.21/share/mysql/charsets/ |
| check_proxy_users        | OFF                                                  |
| collation_connection     | utf8mb4_unicode_ci                                   |
| collation_database       | utf8mb4_unicode_ci                                   |
| collation_server         | utf8mb4_unicode_ci                                   |
| completion_type          | NO_CHAIN                                             |
| concurrent_insert        | AUTO                                                 |
| connect_timeout          | 10                                                   |
| core_file                | OFF                                                  |
+--------------------------+------------------------------------------------------+

 

방법 (2)

mysql> STATUS
--------------
mysql  Ver 14.14 Distrib 5.7.21, for osx10.11 (x86_64) using  EditLine wrapper

Connection id:		29
Current database:	
Current user:		root@localhost
SSL:			Not in use
Current pager:		stdout
Using outfile:		''
Using delimiter:	;
Server version:		5.7.21 Homebrew
Protocol version:	10
Connection:		Localhost via UNIX socket
Server characterset:	utf8mb4
Db     characterset:	utf8mb4
Client characterset:	utf8mb4
Conn.  characterset:	utf8mb4
UNIX socket:		/tmp/mysql.sock
Uptime:			20 hours 48 min 49 sec

Threads: 3  Questions: 1654  Slow queries: 0  Opens: 294  Flush tables: 1  Open tables: 216  Queries per second avg: 0.022
--------------
  • Server characterset : 데이터베이스 생성 시 기본 값을 지정해 주지 않을 경우, 이 값으로 데이터 베이스 캐릭터 셋이 설정 됨.
  • DB characterset : 테이블 생성 시 기본 값을 지정해 주지 않을 경우, 이 값으로 테이블의 캐릭터 셋이 설정 됨.
  • Client characterset : 클라이언트 인코딩 설정 값.

방법 (3)

SELECT * FROM information_schema.SCHEMATA S

위와 다르게 character set이 저장되어있을 경우 명령어를 통해서 mysql을 사용할때 변경 할 수 있지만,
이렇게 하면 데몬이 재실행 될때마다 다시 latin1으로 돌아가기 때문에 기본 값으로 변경하겠습니다.

character set 기본 값을 utf8mb4로 변경

(1) my.cnf 파일을 작성합니다.

vi /etc/my.cnf

 

(2) my.cnf에 다음 설정을 합니다.

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqldump]
default-character-set = utf8mb4

[mysqld]
skip-character-set-client-handshake
init_connect="SET collation_connection = utf8mb4_unicode_ci"
init_connect="SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci"

character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
  • skip-character-set-client-handshake: 클라이언트의 인코딩 설정을 무시하고 데이터베이스 인코딩을 씁니다.
  • init_connect: 데이터베이스에 connect할 경우 실행되는 스크립트입니다.

 

728x90
반응형
Comments