320x100

UTF8 4

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

C++ 서버에서 "인벤토리 부족"이라는 텍스트를 DB에 삽입하려고 할 때 다음과 같이 저장되는 문제가 있었다. const char* text = u8"인벤토리 부족"; DB Tool로 직접 붙어 수정한 경우에는 정상적인 한글로 표기가 되었다. 단순히 표시만 깨진 데이터인가 했는데 HEX값으로 봤을 때도 다른 데이터였다. 좌> C3ACC29DC2B8C3ABC2B2C2A4C3ADE280A0C2A0C3ABC2A6C2AC20C3ABC2B6E282ACC3ACC2A1C2B1 우> EC9DB8EBB2A4ED86A0EBA6AC20EBB680ECA1B1 해결하려고 시도한 방법들 1. C:\Program Files\MariaDB 10.5\data\my.ini 파일 내용 추가 [client] default-character..

DB/MYSQL 2022.11.08

Multibyte ↔ UNICODE ↔ UTF8 변환하기

WideCharToMultiByte 함수 사용을 위해 stringapiset.h 헤더 파일을 lstrlenW 함수 사용을 위해 winbase.h 헤더 파일을 include하고 사용해야 한다. 아래 코드는 예외처리 없이 필요한 코드만 적었으므로 알아서 수정해야 한다. (out 크기가 len보다 작으면 문제) #include #include int Utility::UnicodeToMultibyte(const wchar_t* in, char* out) { if (!in || !out) return 0; int len = WideCharToMultiByte(CP_ACP, 0, in, -1, NULL, 0, NULL, NULL); return WideCharToMultiByte(CP_ACP, 0, in, -1, ..

인코딩 설정 관련 설정

MYSQL에서 다국어 지원을 위해 인코딩을 UTF로 설정 해야한다. UTF은 글자당 바이트 수에 따라 숫자가 붙는데 UTF-8, UTF-16, UTF-32등으로 나뉜다. UTF-16은 기본 다국어 평면에 해당하는 문자를 16비트(2바이트)로, 그 외는 32비트(4바이트)로 저장하고, UTF-32는 모든 문자를 32비트(4바이트)로 저장한다. 가장 많이 사용하는 UTF-8은 8비트부터 32비트까지 가변적으로 ASCII와 유니코드를 병행해 저장할 수 있어 자주 사용한다. 하지만 MYSQL의 utf8은 과거 UTF-8을 완벽하게 지원하지 않고 3바이트까지로 제한된 방식으로 구현했었다. 대부분의 문자들이 해당 바이트 내에서 표현됐기 때문이라고 생각하는데, 최근들어 4바이트로 표현되는 문자들이 생기면서 기존 ut..

DB/MYSQL 2021.10.11
320x100