[php pdo오류해결]Uncaught PDOException: SQLSTATE[HY000]: General error: 1267 Illegal mix of collations

반응형

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