4,490,153 th visitor since 2017.2.1 ( Today : 125 )
Programming
No. 707
Name. swindler
Subject. mysql utf8mb4 connector/J 관련
Main Cate. MySQL
Sub Cate. Java
Date. 2013-04-24 17:07
Hit. 9143 (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



swindler connection url에 다음과 같이 사용한다.
?useUnicode=true&characterEncoding=UTF-8
useUnicode가 없으면 오류날수 있음
2017-05-30
Name
Password
Comment
Copyright © 1999-2017, swindler. All rights reserved. 367,611 visitor ( 1999.1.8-2004.5.26 ), 2,405,771 ( -2017.01.31)

  2HLAB   2HLAB_Blog   RedToolBox   Omil   Omil_Blog