존나게 좆같은 윈도우PHP의 MSSQL 드라이버 이야기


회사의 시스템중에 MSSQL로 구성된 디비가 있다.
이 디비에 접속해서 읽고쓰고를 해야하는 웹사이트를 만들어야 하는데
시간도 없고 해서 기존에 MYSQL과 PHP로 구현되있던 사이트를 변환하기로 했다.
(기능이 거의 동일하다.)


그리고 사용하는 UNIX 계열에 php를 쓸려고 하니 MSSQL을 쓸려면 PHP컴파일을 새로
하고 freeTDS 이딴걸 깔아줘야 한다.
아 어렵다. 내가 UNIX 계열에 약할 뿐더러 이런 시스템설정 삽질은 너무 하기가 싫었다.


그래서 윈도우 PHP 서버를 구성했다.


….


뭐 일단 PHP 자체는 문제가 없다.
문제는 드라이버다.


이 신발병진 드라이버가 xml 형태의 데이타를 못가져오는 거다.
우선 존나 삽질해서 SELECT 문에서 존나 어이없는 CAST를 해서 XML을 가져오게 만들었다.
http://kr2.php.net/manual/kr/ref.mssql.php#71602


그리고 또 계속 작업을 하는데…
이 뭐 병신도 아니고 이번엔 nvarchar 데이타를 못가져온다.
그냥 ???? 로 나오길래 쿼리문에서 CAST도 해줘보고 php쪽에서 컨버팅도 해줘봤다.
안된다.


나중에 지쳐서 해당 문자열의 ASCII 코드를 찍어봤다.
63


….ASCII 테이블에서 ‘?’ 에 해당하는 값이다.
이건 케스팅이나 컨버팅의 문제가 아니고 아예 값을 못가져 온다.


아놔…


이걸 해결하기 위해서
DB쿼리 붙잡고 몇시간,
PHP의 iconv, mb_string_convert 붙잡고 몇시간,
PHP 업그레이드 지랄


하다가 결국에 MS에서 새로 개발했다는 PHP 드라이버를 알게됐다.
http://www.microsoft.com/downloads/details.aspx?FamilyId=85F99A70-5DF5-4558-991F-8AEE8506833C&displaylang=en


이걸로 하니깐 그냥 잘나오는 거다.
난 미칠듯한 환희에 가득차서 이걸로 막 변경할려고 작업을 하다가…


… Store Procedure 는 어떻게 쓰지…


지원 안한다. 아직 CBT 버젼이라 그딴거 없다.
그래도 난 포기하지 않았다. 쿼리를 다 다시 만들더라도 해낼수 있을거란 믿음이 있었다.


…DATETIME 을 지원하지 않는다…………………………………


여기까지가 일요일 오후 11시쯤.


난 좌절했다.
절망에 가득찼다.
난 일어날수조차 없다.


………………………


마구 신발을 외치면서 구글에다가 “php mssql nvarchar” 를 검색하고
이미 봤던 내용을 다시 보면서 내가 놓친것이 없나 찾아보았다.
http://forums.microsoft.com/TechNet/ShowPost.aspx?PostID=2526226&SiteID=17
나랑 똑같은 삽질하는 인간 여기 또 있내…


그러다가 nvarchar 의 데이타를


SELECT

 NCHAR(UNICODE(data))

이런식으로 함수를 써보니
가장 앞의 한글자는 잘 나온다.


“씨” 라고 한글자가 나왔을때 난 눈물을 흘렸다.
(nvarchar 테스트를 위해서 씨발 이라고 넣어두었었다.)
이젠 “발”자도 잘 나오면 되!


열심히 삽질하면서 어떻게든 한글이 나오게 만들기 위해서


SELECT

 NCHAR(UNICODE(SUBSTR(data,1,1)) + NCHAR(UNICODE(SUBSTR(data,2,1)) + NCHAR(UNICODE(SUBSTR(data,3,1)) + NCHAR(UNICODE(SUBSTR(data,4,1)) + NCHAR(UNICODE(SUBSTR(data,5,1)) + NCHAR(UNICODE(SUBSTR(data,6,1)) + NCHAR(UNICODE(SUBSTR(data,7,1)) + NCHAR(UNICODE(SUBSTR(data,8,1)) + NCHAR(UNICODE(SUBSTR(data,9,1)) + NCHAR(UNICODE(SUBSTR(data,10,1)) as data

이런 코드까지 만들어 냈다.
…난 어떻게든.. 무슨짓을 해서든지 돌아가게 만들고 싶었다.


그런데 저 코드가 안돌아가는거다. SUBSTR의 인덱스 범위가 실제 데이타를 넘어서면 아예 해당 필드가 null이 되버린다.


후우….LEN 함수로 길이를 알아낸 다음에 처리를..
아 도대체 어떻게 SELECT문 안에서 WHILE같은걸 돌리지..?
SP에 함수같은거 못 만드나…?


이러면서….계속 무한 삽질을 하다가…


과거의 희미한 기억이 되살아 났다
XML데이타를 VARCHAR로 컨버팅한거!
당연히 NVARCHAT를 VARCHAR로 하는건 시도해 봤었다..
하지만 NVARCHAR를 XML로 컨버팅한다음에 VARCHAR로 컨버팅하면!!!!!!



된다!!!!!!!!!!!!!
엄마 고마워요!
역시 난 근성가이!


정말 미칠듯이 어이없는 SP들이 디비 서버를 가득채우겠지만….
난 정말 근성을 가지고 작업을 했다…


흑흑

PHP + MSSQL 사용시 걸리는문제

내가 삽질했던점.

1. 과연 사용할수 있는가?
윈도우의 경우 ntwdb어쩌구 하는 dll이 있어야 사용할수 있음.
PHP 패키지 깔때 자동으로 깔리는 DLL은 버전이 낮아서 MSSQL 2005에서는 사용이 안됨. DLL의 교채가 필요.

유닉스의 경우 FreeTDS 어쩌구를 깔고 –with-mssql 옵션을 주고 컴파일 해야함.

2. SP는 사용가능한가?
사용가능함. mssql_execute, mssql_bind, mssql_init 등의 함수를 사용하면 됨.

3. MSSQL에서 새롭게 지원하는 unicode 관련 필드 지원
우선 PHP의 윈도우던 UNIX던 MSSQL의 유니코드필드는 지원이 안되는것 같다.
MS 쪽에서 DB-LIB, ODBC를 업그레이드 시켜주지 않아서 그런다고 함.
꽁수로 select를 할때 해당 필드를 varchar, text 등으로 캐스팅해서 사용해야 함.

4. 특정필드의 데이타가 4000바이트를 넘을수 없는문제.
현재 삽질중.
MSSQL이라서 생기는 문제는 아니라고 생각함.

5. 한글이 깨지는 문제.
아 몰라 왜그래 짜증나