회사의 시스템중에 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들이 디비 서버를 가득채우겠지만….
난 정말 근성을 가지고 작업을 했다…
흑흑
뭐야 DB데이터 컨버팅 하면 안된다며~
진작 그런식으로 물어봤음 제시를 했찌 쓱을넘..
-_- 근데 데이터를 컨버팅해놓고 프로그램 돌리는게 아니고
그때그때마다 컨버팅하고 셀렉트하고 하는 식이면 퍼포먼스는 극악일텐데..
(..뭐 관리자 쪽이면 크게 문제되진 않겠지만.. 서비스중인 DB에 지속적인 컨버팅작업으로 오버해드를 주는건 안좋으니 고려하삼)
쿨쿨. M$SQL 버려.
오라클만세~~~~~~
(…한글-2byte문자권 문제는 m$에 비함 200배쯤 더하긴하지만..)
정말 눈물이 없이는 볼수 없는 글이군요.. 흑흑..
전 6개월 전에 캐고생했던거라…
저도 이것때문에 삽질하다.
ㅋㅋ . 재밋게 웃다 갑니다. ~~ 열심히 하세요..
정말, 읽으면서… 웃어 죽는줄 알았어요.
구절, 구절.. 저두 개고생해서리… 팍팍 꼬치네요.
넘… 잘 읽다 갑니다. ^^