[php pdo오류해결]Uncaught PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations
php7 2018. 3. 17. 14:00
반응형
php에서 pdo 인터페이스를 통해 데이터베이스와 연동을 할 때
Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations (utf8_general_ci,IMPLICIT) and (euckr_korean_ci,COERCIBLE)
이러한 에러가 뜰 수 있는데요.
Collation은 데이터베이스에서 설정한 특정 Character Set으로 이루어진 값들을 정렬하는 데이터정렬 규칙이라 보시면 됩니다.
그렇기 때문에 데이터베이스에서 설정한 Collation에 맞는 요청이 pdo인터페이스를 통해 이루어져야 하는데요.
그렇다면 위의 오류는 서버로 SQL을 보낼 때 collation(utf8_general_ci와 euckr_korean_ci)의 차이로 인해 생기는 오류라 할 수 있습니다.
해당 오류는 여러가지 원인에 의해 발생 할 수 있어서 해결방법 또한 다양할 수 있는데요.
예를 들면, utf8_general_ci이 MySQL Connection Collation인 데이터베이스에 SQL문을 보낼 때
아래와 같이
$db = new PDO("mysql:host=$host;dbname=$dbname;", $user, $password);
이렇게 charset를 설정하지 않고 PDO 객체를 생성하여 데이터베이스와 연동할 경우
$sql = "SELECT heightvalue FROM TestTable WHERE name = :name";
$query = $this->db->prepare($sql);
$parameters = array(':name' => $name);
$query->execute($parameters);
위의 SQL문에 $name 에 한글을 포함하여 요청한다면 charset이 달라서 Collation오류가 날 수 있습니다.
해결 방법은,
$db = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8", $user, $password);
charset을 지정하여 데이터베이스를 연동하면
SELECT 쿼리문을 요청할 때 요청값이 UTF-8로 인코딩되어 utf8_general_ci규칙에 따라 name필드를 비교할 수 있게 되고 오류가 해결됩니다.
반응형
'php7' 카테고리의 다른 글
php IDE 추천 (0) | 2018.03.20 |
---|---|
왜 php인가? php의 장점 (0) | 2018.03.15 |