티스토리 뷰

728x90

호스팅을 하고 있다면 업체에서 알아서 설정해 놓으니 대부분 문제 될 것은 없지만 자체 서버에 APM 등을 설치하고 웹 테스트를 진행하는데 한글이 깨진다면 일단 두 가지를 확인해야 한다. 

 

$ locale
LANG=ko_KR.UTF-8
LANGUAGE=ko_KR
LC_CTYPE="ko_KR.UTF-8"
LC_NUMERIC="ko_KR.UTF-8"
LC_TIME="ko_KR.UTF-8"
LC_COLLATE="ko_KR.UTF-8"
LC_MONETARY="ko_KR.UTF-8"
LC_MESSAGES="ko_KR.UTF-8"
LC_PAPER="ko_KR.UTF-8"
LC_NAME="ko_KR.UTF-8"
LC_ADDRESS="ko_KR.UTF-8"
LC_TELEPHONE="ko_KR.UTF-8"
LC_MEASUREMENT="ko_KR.UTF-8"
LC_IDENTIFICATION="ko_KR.UTF-8"
LC_ALL=

일단 시스템의 설정이 한국어 및 UTF-8 인코딩인지 확인해야 한다. 이 정도는 문제가 없을 것이고 다음은 MySQL의 설정을 확인한다.

 

mysql> status
--------------
mysql  Ver 14.14 Distrib 5.7.29, for Linux (i686) using  EditLine wrapper

Connection id:          11
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.7.29-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:       10
Connection:             Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:            /var/run/mysqld/mysqld.sock
Uptime:                 23 min 19 sec

"mysql -u DB사용자아이디 -p"로 데이터베이스에 접속하여 위와 같이 status 명령으로 조회했을 때 characterset이 모두 utf8로 설정되어 있는지 확인해야 한다. 만약 원하는 인코딩이 아니라면 MySQL 설정을 확인해야 한다.

 

필자의 시스템의 경우에는 /etc/mysql/my.cnf에서 별도의 폴더 두개를 포함시키는 방식이라서 클라이언트용 설정과 서버용 설정을 나누어서 설정했다.

 

sudo vi /etc/mysql/conf.d/mysql.cnf
[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

 

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
......
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

위의 설정은 [mysqld] 섹션에 추가해 주면 된다.

 

설정이 끝나면 "sudo /etc/init.d/mysql restart" 로 DBMS를 재가동시킨다. 재가동 이후에는 DB에 접속하여 "status"로 제대로 설정되어 있는지 확인한다. 

 

설정 확인 이후로 생성하는 데이터베이스나 테이블은 자동적으로 설정을 따라가지만 문제는 기존에 생성한 데이터베이스나 테이블이다. 기존 데이터베이스를 변경하려면  DB에 접속하여 다음과 같은 명령을 수행한다.

 

ALTER DATABASE DB이름 CHARACTER SET = utf8 COLLATE = utf8_unicode_ci;

 

DB 변경 전후로 DB의 인코딩을 확인하는 방법은 위의 그림처럼 "SELECT * FROM information_schema.SCHEMATA  WHERE schema_name = "DB이름";"를 사용하면 된다.

 

위의 그림은 "select t.table_name, c.* from information_schema.tables t, information_schema.collation_character_set_applicability c where t.table_collation = c.collation_name and t.table_schema = 'DB이름'" 쿼리로 특정 DB내의 테이블 인코딩을 확인한 것인데 그림에서 보듯이 하나의 DB 내에 서로 다른 인코딩과 처리 방식을 가질 수 있다. 일부는 DB 변경 전에 있는 테이블이다. 이런 경우에는 다음과 같은 명령으로 테이블을 변경할 수 있다.

 

ALTER TABLE 테이블이름 CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

 

■ 이모지를 위한 MySQL 설정

윈도우에서 윈도우+. 또는 윈도우+; 키를 누르면 다음과 같은 창을 통해 이모지를 입력할 수 있다.

😎🚓🚋🚩😎🚓🚋🚩 "😎🚓🚋🚩"좌측에 입력한 문자들이 이모지로 입력한 문자들이다. 그림이 아니라 문자다. 밑줄도 치고 크기도 바꿀 수 있다. 문제는 UTF8 인코딩으로 표시하면 4byte를 차지하기 때문에 이런 문자를 준비 없이 입력하면 오류가 발생한다. 실제 UTF8 인코딩은 문자 하나를 1byte에서 4byte까지로 표현할 수 있으므로 MySQL에서 utf8로 설정하면 문제가 없어야 하지만 MySQL의 버그라 할 수 있고. 이를 해소하는 방법은 앞서 인코딩 설정에서 utf8은 utf8mb4로 utf8_unicode_ci는 utf8mb4_unicode_ci로 바꾸어서 설정하면 된다.

 

 

 

728x90
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함