Programming
No. | 707 | ||||
Name. | swindler | ||||
Subject. | mysql utf8mb4 connector/J 관련 | ||||
Main Cate. | MySQL | ||||
Sub Cate. | Java | ||||
Date. | 2013-04-24 17:07 | ||||
Hit. | 9490 (211.36.27.3) | ||||
File. | |||||
이것때문에 삽질을 참 많이 했다. 하여튼 utf8mb4를 사용해야 emoticon같이 4byte를 사용하는 unicode를 넣을 수 있다. 먼저 mysql을 5.5 이상 업그레이드 한다. database, table, column 을 수정한다. # For each database: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; # For each table: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # For each column: ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.) 최대길이등을 체크한다. utf8mb4에서 4byte 글자가 들어가게 되면, varchar같은 경우 실제 생각한 길이보다 짧아질 수 있다. character를 사용하면 손해라고 하는데, 예를 들어서 char(1)을 사용해도 무조건 4 byte를 잡게 된다. 예를 들어서 255바이트로 잡으면 3byte의 경우 85자, 4 byte의 경우 63자밖에 안 들어갈수 있다. DB 설정을 변경한다. /etc/my.cnf 를 다음과 같은 형태로 변경한다. [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci 가장 좋은 환경상태는 다음과 같다. mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name 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 | | collation_connection | utf8mb4_unicode_ci | | collation_database | utf8mb4_unicode_ci | | collation_server | utf8mb4_unicode_ci | +--------------------------+--------------------+ 10 rows in set (0.00 sec) 필자의 환경 (워낙 지저분해서 이해를) +-------------------------------+----------------------------------+ | Variable_name | Value | +-------------------------------+----------------------------------+ | character_set_client | utf8mb4 | | character_set_connection | utf8mb4 | | character_set_database | euckr | | character_set_filesystem | binary | | character_set_results | utf8mb4 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/local/mysql/share/charsets/ | | collation_connection | utf8mb4_general_ci | | collation_database | euckr_korean_ci | | collation_server | utf8mb4_unicode_ci | +-------------------------------+----------------------------------+ -> 이것도 현재 잘 돌아가는 환경이다. 그 다음에 repair table과 optimize table을 하라는데, 이게 꼭 필요한지는 모르겠다. 손해볼건 없으니 하도록 하자. 마지막으로 mysql connectior/J에 버그가 있다고 나오는데, db url에 ?characterEncoding=utf8mb4 와 같이 지정하면 지원하지 않는 CharacterEncoding이라고 오류가 난다. 그래서 여기서는 characterEncoding을 지정하지 않아야 하고, 필요하면 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci 이런 옵션을 사용해서 mysql 서버를 시작한다. 참, /etc/my.cnf에 다음과 같이 설정한다. [mysqld] init_connect=SET collation_connection=utf8mb4_unicode_ci init_connect=SET NAMES utf8mb4 이 모든것이 필수조건인지는 확실치 않지만, 저렇게 하면 돌아가는건 확실하다. 좀더 확실한걸 해보자니 server restart를 너무 많이 하게 되어, 개발자들의 원성이 ㅎㅎ [바로가기 링크] : http://coolx.net/cboard/develop/707 |
|||||
|
|||||
[Modify] [Delete] | [Reply] [List] |