본문 바로가기
Visual C++/General

[팁] SQLite 사용시 한글 문제 해결.....간단한 팁을 하나 설명할까 합니다.

by hyperhand 2009. 1. 29.

간단한 팁을 하나 설명할까 합니다.

 요새 SQLite 를 많이 쓰더군요..

원격 DB 가 아닌 로컬 DB 로써 이만한 물건이 없더군요...

 속도도 엄청 빠르고...

암호화도 되고 (이건 유료지만 구글한테 잘 물어보면...소스가 있습니다..ㅋ)

 암튼..이넘은 참 좋은데 한글이 간혹 문제더군요...

 그래서 여러모로 사용해 본 결과....알아냈습니다..

 일단 그냥 ansi 로 한글을 넣어도 잘 됩니다..

UTF8 이나 UTF16 등으로 할 필요 없이 그냥 insert 하고.. select 하면 잘 검색이 됩니다..

단 SQLite 관리 툴 등에서는 깨져서 보이죠..기본 이코딩이 UTF8 로 되어있기 때문에 그렇습니다.

그런 툴에서 지원하는지는 모르겠지만 ANSI 로 인코딩해서 보여주는걸 제공하는 툴은 볼 수 있더군요..

 근데 ansi 로 한글을 처리할 경우 문제가 있더군요...

드물긴 하지만.. 제가 사전을 개발 중인데요.. db 를 sqlite 를 사용하는데..

한글 문자열을 가지고.. 대/소 비교를 합니다... 이게 ansi 일 경우 버그가 있더군요...

 

 

그래서 고민끝에...해결 했는데요..

 

처음에 db 생성시에... 그냥 ansi 문자열의 db 파일 경로를 넣어서 생성하구요..

 

그 다음 table 생성시에 이것또한 ansi 문자열로 create table .... 하면 됩니다..

물론 테이블의 필드명은 영문으로 하시는게 좋을듯 하네요..

 

그 다음.. insert into.. 문... 이걸 UTF8 로 바꾸어 처리하면 됩니다...

UTF8 도 멀티바이트 즉 char* 로 표현되기 때문에... 문제없이 잘 됩니다.

당연 insert into 문 안에 한글이 들어가 있겠죠...

 

ansi 를 utf8 로 바꾸는건 찾아보면 알겠지만 단 3줄로 됩니다...일단 이렇게 바꾸어서 데이터를 채웁니다.

 

그 다음...이제 select 를 하게되겠죠..

 

이 select 문의 결과를 utf8 로 얻기 원한다면... select문을 utf8 로 변환하여 넘기고요..

이 utf8 을 ansi 로 바꿔야 제대로 사용할 수 있습니다..

utf8 을 ansi 로 바꾸는건 ansi 를 utf8 로 바꾸는것보다 조금 복잡합니다..

네이버에 물어보면 알려주더군요...

 

unicode 로 얻기 원한다면.. select 문을 unicode 로 변환한다음 날리면..

결과값이 unicode 로 넘어옵니다... 즉 해당하는 sqlite 함수이름중에 끝에 16 이라는 숫자가 붙은 함수를 호출해야 겠지요...

즉 wince 같은데서는 바로 사용할 수 있을겁니다...

 

아! 그리고 다른 팁하나 알려드립니다.

 

sqlite 에서는 insert 할때 별도의 처리가 없으면..바로 commit 을 해버립니다..

그래서 다량의 데이터...저같이 한 10만데이터를 insert into 할 경우에는

꽤 속도가 걸리더군요...

 

그래서 좀 찾아봤더니..

 

 

insert 전에 begin 을 하고..

insert 하고..

commit 를 하면...속도가 엄청 빠릅니다..

 

 

즉 예를 들면..

 

sql_query("begin;");

 for(int i=0; i<100000; ++i)

{

  sql_query("insert into table_name values (1,'sss','eee');");

 }

 sql_query("commit;");

 

위와같이 처리하면 됩니다...

 속도 장난아니게 빠르더군요..

 참고하세요

 

지금 막 알아내서 두서없이 쓴거 같네요..

아무튼..참고하시기 바랍니다...

반응형