====== MySQL charset encoding ======
===== Charset과 Collation의 차이 =====
* [[http://dev.mysql.com/doc/refman/5.6/en/charset-general.html|Character Set General]]
* [[http://blog.naver.com/kumimo/80090609083|MySQL에서 문자셋과 Collation의 차이]]
> A character set is a set of symbols and encodings. A collation is a set of rules for comparing characters in a character set.
> 문자셋(character set)은 심볼(글자)과 인코딩의 묶음이고, Collation은 문자셋의 문자들을 비교하는 규칙이다.
> 예를들어 글자 A=0, B=1, a=10, b=11 이라고 할 때 'A'는 글자이고 '0'은 인코딩이다. 여기서 볼 때 'A'와 'a'는 서로 다른 인코딩을 가지므로 다르다고 볼 수 있다.
> 하지만 만약 대소문자를 구분하지 않는(case insensitive) collation을 지정하면 'A'='a'가 되게 되는 것이다. 대소문자를 지정하지 않는 Collation은 ''_ci''로 끝난다.
===== 기본 설정 =====
* UTF-8 설정 (Ubuntu : ''/etc/mysql/conf.d/encoding.cnf'', RedHat ''/etc/my.cnf'')
#문자셋 지정
[client]
character-sets-dir=utf8
[mysqld]
init_connect=SET collation_connection = utf8_general_ci
init_connect=SET NAMES utf8
#default-character-set=utf8 # deprecated
character-set-server=utf8
collation-server=utf8_general_ci
* 이후 ''service mysql restart''
===== DB 테이블 생성시 문자셋 지정 =====
참조 :[[http://www.phpwact.org/php/i18n/utf-8/mysql|MySQL and UTF-8]]
Database:
(CREATE | ALTER) DATABASE ... DEFAULT CHARACTER SET utf8
Table:
(CREATE | ALTER) TABLE ... DEFAULT CHARACTER SET utf8
===== 현재 문자셋 정보 보기 =====
show variables like 'c%';
결과 -->
character_set_client : utf8
character_set_connection : utf8
character_set_database : utf8
character_set_results : utf8
character_set_server : utf8
character_set_system : utf8
character_sets_dir : /usr/share/mysql/charsets/
collation_connection : utf8_general_ci
collation_database : utf8_general_ci
collation_server : utf8_general_ci
===== 이미 생성된 데이터베이스의 문자셋 바꾸기 =====
-- 테이블의 문자셋 정보 확인.
INFORMATION_SCHEMA.TABLES or SHOW CREATE TABLE [TABLENAME];
mysql> SET character_set_client = utf8;
mysql> SET character_set_results = utf8;
mysql> SET character_set_connection = utf8;
mysql> ALTER DATABASE [DB명] DEFAULT CHARACTER SET utf8;
===== 이미 데이터가 들어간 테이블의 문자셋 변환 =====
create table test (merong varchar(20) collate latin1_general_ci);
-- 이렇게 만들어진 테이블에 한글 데이터를 넣은 후 필드를 euckr 로 변경하려면
-- 다음처럼 해야 합니다.
alter table test modify merong binary(100);
alter table test modify merong varchar(20) collate euckr_korean_ci;
-- binary 로 바꾸면 문자셋 특성이 사라지기 때문에 이런 변환과정을 거쳐야
-- 합니다(메뉴얼에 의하면). 그냥 바꾸면 문자들이 손상됩니다.
참조 : [[http://database.sarang.net/?inc=read&aid=22988&criteria=mysql&subcrit=&id=&limit=20&keyword=collation&page=1|MySQL 4.1.8 RPM 설치시 한글설정. Database.sarang.net]]
===== 스마트폰 이모지(emoji) 입력 =====
* MySQL의 UTF-8은 3바이트 문자까지만 입력 가능하다. 4바이트를 입력하려면 **utf8mb4** 문자셋으로 변경해야 한다.
* [[https://stackoverflow.com/questions/766809/whats-the-difference-between-utf8-general-ci-and-utf8-unicode-ci|mysql - What's the difference between utf8_general_ci and utf8_unicode_ci]] - **utf8-unicode-ci** 권장
*utf8_general_ci와 utf8_unicode_ci는 한국어, 영어, 중국어, 일본어에서는 Collation의 결과가 동일하다. 성능은
utf8mb4_general_ci가 더 좋다.
* DB 서버에서 문자셋을 ''UTF8MB4'' 로 만들거나,
CREATE DATABASE my_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
* 혹은 특정 컬럼만 변경할 경우
ALTER TABLE table_name MODIFY columnName text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
* DB 자체를 UTF8MB4 로 만들어도 JDBC URL에 ''characterEncoding=UTF8''만 가능하다. UTF8MB4는 실존하는 표준 인코딩이 아니므로 명시할 수 없다.
* DB 전체에 대한 charset 설정을 UTF8MB4로 하면 ''characterEncoding'' 설정을 하지 않고 ''unicode=true''만 있어도 자동인식한다.
* 그렇지 않을 경우에는 JDBC 커넥션이 맺어질 때마다 아래 명령으로 커넥션의 인코딩을 변경해야 한다. [[java:database:connectionpool|Java JDBC Connection Pool / DataSource]] 사용시 DB 접속을 맺을 때마다 ''initialSql''을 지정하는 방법이 있으므로 그 방법으로 모든 커넥션을 맺을 때마다 해준다.
set names utf8mb4 collate utf8mb4_unicode_ci;
===== 참조 =====
* [[https://www.percona.com/blog/migrating-to-utf8mb4-things-to-consider/|Migrating to utf8mb4: Things to Consider - Percona Database Performance Blog]]