이미지 파일은 각각
1. 프로그램 실행상태
2. MYSQL 테이블 상태
3. MYSQL 문자셋 상태
DB로 간단한 프로그램을 짜고 있는데 언어셋 문제에서 난관에 봉착했습니다.
일주일이 넘어가는데 도통 답이 안보여서 질문까지 하게되었습니다.
문제사항은 DBGrid의 값들이 숫자가 아닌 문자 자료형이면 VARBYTE로 표기되는것입니다.
SQL쿼리 날린 결과값을 반복문으로 돌려가면서 Memo등에 출력하면 한글이 정상적으로 표기되는데
DBGRID만 꼭 저렇게 나오네요, 구글링 해보니 저런 사례가 간혹가다 있는데 해결된걸 못봤습니다.
수작업으로 출력한 결과 SQLQuery1 과 ClientDataSet1까지는 자료가 한글로 잘 넘어와서 메모장에
출력됩니다만 DataSource1 거쳐서 DBGrid만 들어가면 문자들이 저렇게 나와버립니다.
DB그리드는 기본 TDBGrid와 Raize 컴포넌트의 RzDBGRID 둘다 저모양으로 나옵니다.
아래는 환경사항입니다
- 툴은 C++Builder6, DB는 MYSQL 5.1.41-community 입니다(MySQL 문자셋: UTF-8 Unicode (utf8))
- 컴포넌트는 DBGrid와 DBexpress를 사용했습니다
- 드라이버 파일은 포럼에서 받은 빌더용 MySQL 5.x 드라이버를 사용하였습니다.
- 테스트 시 문자셋은 가능한한 모두 UTF8로 통일 했으며 EUCKR로 통일한 상태에서도 같은 증상이 발생합니다
- set name 을 사용해서 각각 euckr과 utf8로 해줘도 같은 VARBYTE 상태로 표기됩니다
- ClientDataSet1 이나 SQLQuery1 를 반복문으로 돌려서 레코드 값을 Memo1에 찍어보면 한글이 잘나옵니다
- 컴포넌트 는 각각 연결해주는 값만을 설정하였으며 별도 내용은 손보지 않았습니다.
아래는 예제의 소스 입니다.
bool __fastcall TForm1::DBconnection()
{
bool bResult = false;
__try
{
try
{
SQLConnection1->DriverName = "dbxmysql";
SQLConnection1->GetDriverFunc = "getSQLDriverMYSQL50";
SQLConnection1->LibraryName = "dbxopenmysql50.dll";
SQLConnection1->Params->Clear();
SQLConnection1->Params->Values["User_Name"] = "root";
SQLConnection1->Params->Values["Password"] = "apmsetup";
SQLConnection1->Params->Values["HostName"] = "127.0.0.1";
SQLConnection1->Params->Values["Database"] = "mdsi_lab_erp";
SQLConnection1->Open();
//SQLQuery1->SQL->Clear();
//SQLQuery1->SQL->Add("set names euckr");
//SQLQuery1->SQL->Add("set names utf8");
//SQLQuery1->ExecSQL();
bResult = true;
}
catch(Exception &E){
//..
}
}
__finally{return bResult;}
}
아래는 각 DBExpress 컴포넌트값들의 설정입니다
[SQLConnection1]
Connected = true
ConnectionName = MYSQL
DriverName = dbxmysql
GetDriverFunc = getSQLDriverMYSQL50
KeepConnection = true
LibraryName = dbxopenmysql50.dll
Name = MYSQLCon
VendorLib=libmysql.dll
[SQLDataSet1]
SQLConnection = SQLConnection1
[DataSEtProvider1]
Constraints = true
DataSet = MySQLQuery
Exported = true
Name = DataSetProvider1;
[ClientDataSet1]
Active = true;
ProviderName = DataSetProvider1;
[DataSource1]
DataSet = ClientDataSet1
Enabled = true
[MySQLQuery]
SQLConnection = MySQLCon
SQL = SELECT * FROM mdsi_afterservice
[SQLClientDataSet1]
FetchOnDemand = true;
이상입니다, 도데체 어디가 문제길래 저렇게 나오는걸까요. 많은 답변 부탁드립니다.