⭐️ Amazon Web Service/Amazon RDS

[mysql 한글입력 오류] SQL Error [1366] [HY000]: Incorrect string value

mini_world 2021. 9. 10. 18:26
목차 접기

 

🜸 오류 내용

한글 사용 시 "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

 

 


 

728x90