2012년 10월 10일 수요일

XE2(3) 에서 ZeosLib7 사용할때

MySql 4.1을 처음 설치 할때 문자세트를 데폴트로 euckr 로 설정하여 사용하던 데이터 베이스를 ZeosLib 5.5 버전 이하를 사용하여 데이터를 가져오기 위하여 Zconnection 의 Properties 속성에 codepage=euckr 로 지정하여 사용해 오다.

델파이 2010 버전에서 델파이가 Unitcode를 지원한다 하여 Unicode 지원 XeosLib 6.5 등의 버전을 이용하여 역시 같은 방법으로 codepage=euckr로 지정하여 사용 하였다.
물론 Mysql도 unicode를 지원 할 수 있는 5.1 버전으로 바꾸었다.

쿤자 코드 체계를 일원화 하기 위하여 FrontMySql 5.0 버전을 이용하여 디비의 문자 속성을 전부 utf8 로 바꾼 상태에서 데이터를 ZeosLib를 써서 데이터를 가져 오면 부분적으로 한글이 깨어져 읽혀 지더군요. 해서 특정 테이블만 euckr 로 바꾸어서 사용하고 있었다.

ZeosLib7 버전을 다운 받아 설치하여, 예전에 운용하던 프로그램에 적용 하였다,
데이터 읽어오거나 한글 깨어 짐은 없으나, 문자의 길이 쪽에 문제가 발생하여 숫자나 기호를 잘 불러오지 못하는 현상과 ParamByName에 오류가 발생하여 정리하여 봤습니다.

MtSql 서버측    크라이언트측
euckr               euckr : 숫자/기호 오류, ParamByName('').Asstring 은 정상
euckr               utf8 : 정상, ParamByName('').Asstring 오류

utf8                  euckr : 숫자/기호 오류, ParamByName('').Asstring 은 정상
utf8                  utf8 : 정상,  ParamByName('').Asstring 오류 (주1)

주1 방법에서 해결 방법을 찾다가
ZQuery1.ParamByName('ijijum').AsString :=  '북광주' 를
ZQuery1.ParamByName('ijijum').AsString :=  '북광주%' 으로 바꾸어 해결하였으나,
뭔가 찜찜하더군요.

다른 방법을 찾아보다가
  ZQuery1.SQL.Text:= 'select * from cmaster where (ijijum like :ijijum)';
  ZQuery1.ParamByName('ijijum').AsString := edit1.text;

  ZQuery1.ParamByName('ijijum').AsAnsiString := edit1.text;
으로 바꾸어서 해결하였습니다.

ZeosLib의 AsString 에서 문제가 있는 것 처럼 보이더군요.
위 방법은 뭐가 편법인것 같아서 다른 방법을 찾아보다가

  ZQuery1.SQL.Text:= 'select * from carecallmaster where (ijijum like :ijijum)';
  //ZQuery1.ParamByName('ijijum').AsString := edit1.text;
  ZQuery1.Params.ParamByName('ijijum').DataType:= ftString;
  ZQuery1.Params.ParamByName('ijijum').Value:= Edit1.Text;
방법을 사용하였더니 정상이더군요, 참고하세요.

수정합니다: 중요! 소스를 살펴 보다 혹시나 해서 시험해본 결과
Zconnection 에 보면 PrepareSQL 이라는 옵션이 있습니다.
이게 디폴트가 False 인데 이걸 True로 바꾸어 주니 AsString 이 정상으로 작동됩니다.
(ㅎㅎㅎ 이것 때문에 엄청 고민 많이 했는데.........)




데이터

댓글 없음:

델파이 12.1이냐 11.3이냐?

 델파이가 12.1이 나왔습니다. 혹시 11.3버전의 커뮤니티버전이 필요하시는분이 있을 수 있을 것 같아 https://altd.embarcadero.com/.../RADStudio_11_3_esd_28... 와 이것 찾느랴 엄청고생함.