php+mysql 구버전에서 php+mysql최신버전으로 마이그레이션할때 흔히들 겪는 문제중 아래의 문제들이 있습니다.



1. DB 데이터의 이전 문제

2. php 로 mysql 접속시 한글 인코딩 문제

3. 예약어와 동일한 컬럼명의 사용의 문제

4. PASSWORD 함수 변경의 문제



일반적인 경우 작업하는 사이트에서 문제가 발생하지 않는 다면 위의 두가지 사항은 참고하지 않으셔도 됩니다.



1. DB 데이터 이전 문제

- 기존 DB가 euckr로 구성되어 있었다면 상관이 없습니다. 문제는 기존 DB가 utf-8등으로 구성되었을때의 문제입니다. 이 경우 데이터를 임포트할때 --default-character-set=utf8 등의 옵션을 주어 임포트 작업해야 합니다.



2. php로 mysql 접속시 한글 인코딩 문제

- 최신버전의 PHP에서는 DB의 Default-charset 설정을 따르지 않고, PHP 자체내의 셋팅을 따르는 경우가 많습니다. 따라서 UTF-8로 임포트한 데이터는 php에서 UTF-8로 처리되지 않고 자체 한글 인코딩을 따르는 경우에 한글이 깨지는 경우가 많습니다. 이런경우 mysql_connect 함수로 DB에 접속한 이후, @mysql_query("SET NAMES utf8"); 쿼리를 날려 PHP의 기본 커넥션을 utf-8로 변경해주는 것이 좋습니다.



3. 예약어와 동일한 컬럼명의 사용의 문제

- 구버전의 mysql에서 아무런 에러가 발생하지 않던 쿼리가 새로운 버전의 PHP+mysql에서 문제가 발생하는 경우가 있습니다. 바로 예약어를 컬럼명으로 사용하는 경우입니다. 예를 들어 select * from term where div like '%기타%' 라는 쿼리가 있을때 기존 버전에서는 문제 없이 작동하지만, 신버전의 PHP+mysql에서는 여지없이 에러를 날려버립니다. div이라는 컬럼명때문에 그런건데요. div이란 컬럼명이 mysql에서 예약어로 사용되기 때문에, 예약어와 동일한 이름의 컬럼명을 사용하기 위해서는 컬럼명을 ` ` 으로 묶어야 합니다.



즉, select * from term where div like '%기타%' 쿼리는

     select * from term where `div` like '%기타%' 로 변경되어야 에러가 발생하지 않습니다.



또한 앞으로의 쿼리에는 모든 컬럼명에 `를 붙이면 예약어가 추가되어도 중복될 걱정 없이 사용할 수 있으니, 가급적 컬럼명에 ``로 묶는 습관을 들이는것도 괜찮은 방법 같습니다.

주의) ` 와 '는 다른 문자이오니 주의하시길..쉬프트 없이 물결표시 키..



4. PASSWORD 함수 변경의 문제

- 구버전의 mysql에서는 PASSWORD 함수를 암호화하는데 64bit 암호화 방법을 이용했습니다. 그러나 현재는 128bit 암호화를 사용하도록 변경되었습니다. 문제는 함수의 이름이 과거와 현재가 동일하다는데 있습니다. 64bit 암호화로 저장된 오래된 데이터가 마이그레이션후 128bit PASSWORD 함수로 제대로 풀릴리가 없기때문입니다. 그렇다고 해서 64Bit 암호화된 데이터를 128Bit로 변경할 수 있는 방법이 따로 있는것도 아닙니다.(제가 검색해본결과 없다고 결론내렸습니다.)



방법은 기존 데이터를 날리고, 새로 128bit 암호화를 따라가던가, 보안에서는 손해를 봐야하지만 기존에 사용하던 64bit 암호화 함수를 사용하는 방법이 있습니다. 전자는 설명할 필요가 없고, 후자는 OLD_PASSWORD라는 함수를 사용하시면 됩니다.



예를 들어 select * from member where id='lodes' and passwd = PASSWORD('1234') 라는 쿼리가 있다면 PASSWORD 함수를 OLD_PASSWORD('1234') 로 변경해주시면 됩니다.
리눅스  |  06/04/05 13:31
|

샹콤홍쓰's Blog is powered by Daum & tistory