DB/MYSQL

서버에서 DB로 UTF-8 데이터 삽입시 데이터가 깨지는 문제

MAKGA 2022. 11. 8. 20:53
320x100

C++ 서버에서 "인벤토리 부족"이라는 텍스트를 DB에 삽입하려고 할 때 다음과 같이 저장되는 문제가 있었다.

const char* text = u8"인벤토리 부족";

DB Tool로 직접 붙어 수정한 경우에는 정상적인 한글로 표기가 되었다.

좌-서버 데이터, 우- 수기 데이터

 

단순히 표시만 깨진 데이터인가 했는데 HEX값으로 봤을 때도 다른 데이터였다.

좌> C3ACC29DC2B8C3ABC2B2C2A4C3ADE280A0C2A0C3ABC2A6C2AC20C3ABC2B6E282ACC3ACC2A1C2B1

우> EC9DB8EBB2A4ED86A0EBA6AC20EBB680ECA1B1


해결하려고 시도한 방법들

 

1. C:\Program Files\MariaDB 10.5\data\my.ini 파일 내용 추가

[client]
default-character-set=utf8
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
init_connect=SET collation_connection=utf8_general_ci
init_connect=SET NAMES utf8
character-set-client-handshake=FALSE
[mysql]
default-character-set=utf8

 

 

2. 현재 charset과 collation 확인 확인

show variables like 'c%';

 

DB charset 변경

ALTER DATABASE 'dbname' DEFAULT CHARACTER SET UTF8;

DB charset 확인

SELECT default_character_set_name, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA 
WHERE schema_name = "dbname";

Table charset 변경

ALTER TABLE 'tablename' CONVERT TO CHARACTER SET UTF8;

Table charset 확인

SHOW FULL COLUMNS FROM tablename;

 

c++에서 사용중인 mariadb connector을 이용해 db에 connect시 host 주소에 사용할 캐릭터 셋을 추가

const char* host = "tcp://127.0.0.1:3306/dbname?charset=utf8";

320x100