MYSQL character set utf8로 변경하기
[환경] mysql : 5.5.57
php 파일을 통해 insert문과 select문을 하여 mysql에 데이터를 넣거나 가져오는데 한글이 물음표로 나오거나 깨지는 현상이 일어났다. 때문에 이 문제를 해결한 과정을 적어보려고 한다. 이 문제를 해결하기 위해 php파일 내에서의 character set과 파일을 저장할때 인고딩 형식과 mysql의 character set을 모두 utf8로 통일시켜줘야 한다. 이 게시물에서는 mysql의 character set을 설정하는 과정을 담아보려고 한다.
1. my.cnf 파일수정
먼저 mysql의 character set 설정을 바꿔주기 위해
/etc/mysql/my.cnf
경로에 있는 설정파일을 수정하기로 했다.
[client]
default-character-set = utf8
[mysqld]
init_connect="SET collation_connection = utf8_general_ci"
init_connect="SET NAMES utf8"
default-character-set = utf8
character-set-server = utf8
collation-server = utf8_general_ci
[mysql]
default-character-set = utf8
[mysqldump]
default-character-set = utf8
위의 내용들을 추가해준 후
service mysql restart
명령어를 사용하여 mysql을 restart를 했더니 Job for mysql.service failed. See ‘systemctl status mysql.service’ and ‘journalctl -xn’ for details. 이라는 오류문구가 나왔다.
service mysql status
를 통해 mysql이 동작하고 있는지 확인해 보았다.
● mysql.service - LSB: Start and stop the mysql database server daemon
Loaded: loaded (/etc/init.d/mysql)
Active: failed (Result: exit-code) since Thu 2017-12-28 04:10:16 KST; 1m in 13s ago
Process: 18829 ExecStop=/etc/init.d/mysql stop (code=exited, status=0/SUC CESS)
Process: 19761 ExecStart=/etc/init.d/mysql start (code=exited, status=1/F AILURE)
Dec 28 04:10:16 cinnamonpi_4 /etc/init.d/mysql[20601]: 0 processes alive...
Dec 28 04:10:16 cinnamonpi_4 /etc/init.d/mysql[20601]: [61B blob data]
Dec 28 04:10:16 cinnamonpi_4 /etc/init.d/mysql[20601]: error: 'Can't con...
Dec 28 04:10:16 cinnamonpi_4 /etc/init.d/mysql[20601]: Check that mysqld...
Dec 28 04:10:16 cinnamonpi_4 /etc/init.d/mysql[20601]:
Dec 28 04:10:16 cinnamonpi_4 mysql[19761]: Starting MySQL database serv...!
Dec 28 04:10:16 cinnamonpi_4 systemd[1]: mysql.service: control process...1
Dec 28 04:10:16 cinnamonpi_4 systemd[1]: Failed to start LSB: Start and....
Dec 28 04:10:16 cinnamonpi_4 systemd[1]: Unit mysql.service entered fai....
mysql이 오류로 인해 동작을 안하고있었다. 오류로그를 확인해보기로 했다.
/var/log/mysql/error.log 경로의 오류로그를 살펴보니
171228 4:27:27 [ERROR] /usr/sbin/mysqld: unknown variable ‘default-character-set=utf8’ 이라는 오류로그를 확인할 수 있었다.
my.cnf 설정파일에서 [mysqld]의 default-caracter-set=utf8 이 부분이 문제가 된것으로 보인다.
여러 자료들을 살펴보니 5.5.3버전 부터 mysqld의 default-caracter-set 설정이 없어진 것을 알게 되었다.
https://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_default-character-set
my.cnf 설정파일에서 [mysqld]의 default-caracter-set=utf8 부분을 지운 후에 다시 mysql을 start시키니 정상적으로 작동이 되었다.
2. mysql db 및 table character set 변경
mysql 내에서 status를 통해 character set을 확인해 보니
Connection id: 37
Current database: test
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.5.57-0+deb8u1 (Raspbian)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/run/mysqld/mysqld.sock
Uptime: 9 min 45 sec
위와 같이 Db characterset이 latin1로 되있는 것을 확인하였고, 다시 insert문과 select문을 해봤지만 여전히 한글이 깨지는 현상이 일어났다.
alter database test default character set utf8
을 통해 db의 character set을 바꿔주고
alter table attend convert to charset utf8
로 table의 character set 또한 바꿔주었다.