🜸 오류 내용
한글 사용 시 "SQL Error [1366] [HY000]: Incorrect string value" 에러가 발생합니다.
Mysql Character Encoding 을 변경하면 한글을 정상적으로 쓸 수 있습니다. :)
※ 주의사항
1) 테이블 생성 전에 CHARACTER_SET 값을 변경했다면 괜찮지만, 테이블을 이미 생성한 경우라면 테이블, 컬럼 모두 인코딩을 변경해주어야 합니다.
2) 한글은 utf8, 이모지는 utf8mb4를 사용합니다. 한글과 이모지 모두 사용하려면 utf8mb4 를 사용합니다.
3) RDS Dynamic Parameter는 재부팅할 필요 없이 운영중인 데이터베이스에 바로 반영됩니다. 단, 기존 연결된 커넥션에서 정보를 물고있을 수 있으니, 파라메터 변경후에는 전체 커넥션을 리로드 해주는 과정이 필요합니다.
🜸 확인 방법
아무 설정도 하지 않고 바로 사용한 경우, 기본 문자 셋이 latin1 입니다. 이것때문에 오류가 나와요.!
한글을 insert하는 경우 '???' 값으로 저장됩니다.😅
1) 기본 변수 확인
mysql> show variables like 'c%';
+--------------------------+-----------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/oscar-5.7.mysql_aurora.2.07.1.0.425.0/share/charsets/ |
| check_proxy_users | OFF |
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database | latin1_swedish_ci |
| collation_server | latin1_swedish_ci |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
| core_file | ON |
+--------------------------+-----------------------------------------------------------------+
16 rows in set (0.01 sec)
2) 테이블 인코딩 값 확인
mysql> select * from SCHEMATA;
+--------------+--------------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+--------------------+----------------------------+------------------------+----------+
| def | information_schema | utf8 | utf8_general_ci | NULL |
| def | employees | latin1 | latin1_swedish_ci | NULL |
| def | mysql | latin1 | latin1_swedish_ci | NULL |
| def | performance_schema | utf8 | utf8_general_ci | NULL |
| def | sys | utf8 | utf8_general_ci | NULL |
+--------------+--------------------+----------------------------+------------------------+----------+
5 rows in set (0.01 sec)
3) 컬럼 인코딩 값 확인
mysql> SHOW FULL COLUMNS FROM employees.employees;
+------------+---------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| Field | Type | Collation | Null | Key | Default | Extra | Privileges | Comment |
+------------+---------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
| emp_no | int(11) | NULL | NO | PRI | NULL | | select,insert,update,references | |
| birth_date | date | NULL | NO | | NULL | | select,insert,update,references | |
| first_name | varchar(14) | latin1_swedish_ci | NO | | NULL | | select,insert,update,references | |
| last_name | varchar(16) | latin1_swedish_ci | NO | | NULL | | select,insert,update,references | |
| gender | enum('M','F') | latin1_swedish_ci | NO | | NULL | | select,insert,update,references | |
| hire_date | date | NULL | NO | | NULL | | select,insert,update,references | |
+------------+---------------+-------------------+------+-----+---------+-------+---------------------------------+---------+
6 rows in set (0.01 sec)
🜸 해결 방법
1) Aurora 파라메터 그룹 변경 (기본 변수 변경)
RDS의 파라메터 그룹 설정을 변경해줍니다. (Aurora의 경우 클러스터 파라메터를 변경하세용)
Dynamic 값은 서버 재부팅 없이 적용 됩니다.
파라메터 변경 후 적용된 파라메터 확인 (반영되는데 시간이 조금 걸릴 수 있습니다.)
mysql> show variables like 'c%';
+--------------------------+-----------------------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8 |
| character_set_filesystem | utf8 |
| character_set_results | utf8mb4 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/oscar-5.7.mysql_aurora.2.07.1.0.425.0/share/charsets/ |
| check_proxy_users | OFF |
| collation_connection | utf8mb4_0900_ai_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
| completion_type | NO_CHAIN |
| concurrent_insert | AUTO |
| connect_timeout | 10 |
| core_file | ON |
+--------------------------+-----------------------------------------------------------------+
16 rows in set (0.00 sec)
2) 테이블 / 컬럼
테이블 기본 인코딩 값을 utf8로 변경합니다.
mysql> alter table employees.employees default charset = utf8;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
테이블의 기본 인코딩 값을 utf8로 변경했다고 해도, 기존 컬럼들은 반영되지 않습니다.
기존 컬럼값들이 데이터를 변경할 수 있도록 CONVERT 합니다.
mysql> ALTER TABLE employees.employees CONVERT TO character SET utf8;
Query OK, 300024 rows affected (3.36 sec)
Records: 300024 Duplicates: 0 Warnings: 0