PHP의 MySQLI Extension을 사용하여 데이터베이스에 연결할 때 종종 MySQLI :: SET_CHARET 메소드를 사용하여 캐릭터 세트를 설정하는 개발자가 종종 볼 수 있습니다. 그렇다면 mysqli :: set_charset 에 의해 설정된 문자 세트는 데이터베이스 자체의 기본 문자 세트와 관계가 있습니까? 그들 사이에 갈등이 있습니까? 이 기사는 두 가지와 모범 사례 간의 관계를 자세히 설명합니다.
데이터베이스의 기본 문자 세트는 데이터베이스 서버 또는 데이터베이스 인스턴스 (스키마)로 구성된 기본 문자 세트를 나타냅니다. 예를 들어, MySQL 데이터베이스를 작성할 때 기본 문자 세트가 있으며 공통은 UTF8MB4 또는 Latin1 입니다. 테이블이나 필드를 만들 때 문자 세트를 지정하지 않으면 데이터베이스의 기본 문자 세트가 상속됩니다.
SQL 문을 통해 설정된 현재 데이터베이스 기본 문자를 볼 수 있습니다.
SHOW VARIABLES LIKE 'character_set_database';
서버의 기본 문자 세트를 볼 수도 있습니다.
SHOW VARIABLES LIKE 'character_set_server';
mysqli :: set_charset은 현재 연결된 문자 세트를 설정하는 데 사용되는 PHP MySQLI 클래스의 메소드입니다. 이 설정은 데이터베이스 서버에 문자 인코딩이 클라이언트가 보낸 데이터를 구문 분석하는 데 사용되는 문자 인코딩 및 쿼리 결과가 반환 될 때 사용되는 인코딩을 알려줍니다.
$mysqli = new mysqli('gitbox.net', 'user', 'password', 'database');
$mysqli->set_charset('utf8mb4');
위의 코드에서 Set_charset ( 'UTF8MB4')은 클라이언트가 보내고 수신 한 데이터가 UTF8MB4 에서 인코딩된다는 것을 MySQL 서버에 알리는 것을 의미합니다.
다른 행동 범위
데이터베이스의 기본 문자 세트는 데이터베이스 수준에 영향을 미치며, 이는 주로 기본적으로 데이터 저장 인코딩을 제어합니다.
mysqli :: set_charset은 클라이언트와 데이터베이스 간의 인코딩 형식에 영향을 미칩니다.
데이터 단계는 다르게 영향을 미칩니다
데이터베이스의 기본 문자 세트는 데이터베이스의 스토리지 데이터 형식을 결정합니다.
mysqli :: set_charset은 클라이언트와 서버 간의 데이터 교환에 대한 인코딩 형식을 결정하여 양 당사자가 일관되도록합니다.
우선 순위와 일치
데이터베이스에 연결하면 mysqli :: set_charset이 명시 적으로 설정되지 않은 경우 클라이언트와 서버 간의 통신은 서버의 기본 문자 세트 ( 일반적 으로 구성이 변경되지 않는 한)을 사용합니다. 데이터베이스 기본 문자 세트가 UTF8MB4 이고 클라이언트 커뮤니케이션 인코딩이 LATIN1 일 때는 데이터가 끊어집니다.
따라서 데이터베이스 테이블이 UTF8MB4 인 경우에도 서버가 SET_CHARSET을 사용하여 서버에 동일한 인코딩을 사용하여 데이터를 전송하도록 지시하지 않으면 쿼리 결과 또는 데이터를 삽입하면 인코딩 오류가 발생할 수 있습니다.
클라이언트와 서버 간의 일관되지 않은 문자 세트로 인해 차량 코드를 피하기 위해 모범 사례는 데이터베이스에 연결 한 후 즉시 호출하는 것입니다.
$mysqli->set_charset('utf8mb4');
이것은 다음과 같이 보증합니다.
전송 된 데이터 인코딩은 데이터베이스 인코딩과 일치합니다.
쿼리 결과가 올바르게 인코딩됩니다
불일치를 인코딩하여 발생하는 예외 문자 문제를 피하십시오
데이터베이스 기본 문자 세트는 데이터의 스토리지 인코딩을 결정합니다.
mysqli :: set_charset 클라이언트가 서버와 통신 할 수있는 인코딩 형식을 결정합니다.
두 사람은 데이터가 올바르게 전송되고 저장되도록 일관성이 있어야합니다.
데이터베이스 기본 문자 세트가 UTF8MB4 인 경우에도 SET_CHARSET을 사용하여 PHP 코드에서 연결 인코딩을 명시 적으로 설정해야합니다.
$mysqli = new mysqli('gitbox.net', 'username', 'password', 'database');
if ($mysqli->connect_error) {
die('연결이 실패했습니다:' . $mysqli->connect_error);
}
// 클라이언트 연결 문자를 설정하십시오 utf8mb4
$mysqli->set_charset('utf8mb4');
$sql = "SELECT * FROM users";
$result = $mysqli->query($sql);
while ($row = $result->fetch_assoc()) {
echo $row['username'] . "<br>";
}
$mysqli->close();
이렇게하면 데이터베이스에서 검색된 중국어 또는 특수 문자가 차단되지 않도록합니다.