먼저이 두 가지 방법의 사용을 간단히 검토해 봅시다.
MySQLI 에서 set_charset 메소드는 MySQL 데이터베이스에 연결할 때 문자 세트를 설정하는 데 사용됩니다. 예를 들어, 문자를 UTF-8로 설정하려면 다음을 수행 할 수 있습니다.
$mysqli = new mysqli("localhost", "user", "password", "database");
if ($mysqli->connect_error) {
die("연결이 실패했습니다: " . $mysqli->connect_error);
}
$mysqli->set_charset("utf8");
이 메소드는 연결을 통해 실행 된 모든 쿼리가 지정된 문자 세트를 사용하도록합니다.
PDO 에서 문자 세트 설정은 일반적으로 DSN에 직접 지정되지만 연결 후 동적으로 조정 해야하는 경우 setAttribute 메소드를 사용할 수 있습니다. 일반적인 사용법은 다음과 같습니다.
$dsn = 'mysql:host=localhost;dbname=database;charset=utf8';
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'"
];
$pdo = new PDO($dsn, 'user', 'password', $options);
현재 문자 세트는 pdo :: mysql_attr_init_command 를 통해 설정되어 데이터베이스에 연결할 때 UTF-8 인코딩이 사용되도록합니다.
mysqli :: set_charset 및 pdo :: setattribute는 문자 세트를 설정하는 데 사용될 수 있지만, 특히 함께 사용해야 할 때 특정 사용법과 효과에 차이가 있습니다.
MySQLI 및 PDO를 사용하여 데이터베이스에 연결할 때 문자 세트 설정 타이밍이 매우 중요합니다. MySQLI 의 경우 캐릭터 세트의 설정은 가능한 빨리 수행해야하며 연결을 설정 한 후 즉시 설정하는 것이 가장 좋습니다. 후속 쿼리에서 세트를 변경하면 캐릭터 세트가 일관되지 않아 문제가 발생할 수 있습니다.
PDO 의 경우 연결 중에 DSN을 통해 설정된 문자를 설정하는 것이 일반적으로 가장 적절한 접근법입니다. 사후 설정에 stattribute 메소드를 사용할 수는 있지만 실행 된 쿼리를 무시하지 않을 수 있으므로 연결을 생성 할 때 문자 세트를 직접 지정하는 것이 좋습니다.
동일한 애플리케이션에서 MySQLI 와 PDO를 모두 사용하고 동일한 데이터베이스 연결을 공유하는 경우 (예 : 두 메소드 모두 요청의 다른 부분에서 사용됨) 문자 세트 충돌에 특히주의해야합니다. 예를 들어, MySQLI 및 PDO 의 문자 세트 설정은 독립적이며 각각 각각의 쿼리에 영향을 미칩니다. 연결이 MySQLI 에서 UTF-8로 설정되고 PDO 에서 Latin1로 설정되면 일관되지 않은 문자 인코딩 성능이 발생할 수 있습니다.
캐릭터 세트 충돌을 피하기 위해 제안 된 솔루션 및 모범 사례는 다음과 같습니다.
가능하면 동일한 요청에서 MySQLI 와 PDO를 모두 사용하지 마십시오. 데이터베이스 작업을 수행하는 방법 중 하나를 선택하여 문자 세트 설정의 균일 성을 보장하는 것이 좋습니다. 예를 들어, PDO 의 사용은 데이터베이스 액세스 인터페이스로 선호됩니다. 더 유연하고 여러 데이터베이스 유형을 지원하기 때문입니다.
MySQLI 또는 PDO를 사용하든 모든 데이터베이스 연결에서 동일한 문자 세트 설정을 사용해야합니다. 다중 대사 연결 인 경우 각 연결은 Set_Charset 또는 Setattribute를 사용하여 일관성을 보장하는 것이 좋습니다.
보다 복잡한 응용 프로그램의 경우 데이터베이스 구성에서 기본 문자를 균일하게 설정하는 것이 좋습니다. 예를 들어, 데이터베이스 서버에서 기본 문자를 UTF-8로 설정하여 응용 프로그램에서 문자 세트 설정을 줄일 수 있습니다.