MySQL 문자 집합

이상적으로는 적절한 문자 집합이 서버 수준에서 설정되며 이 작업은 MySQL 서버 매뉴얼의 » 문자 집합 구성 섹션에 설명되어 있습니다. 또는 각 MySQL API는 런타임에 문자 집합을 설정하는 메서드를 제공합니다.

주의

문자 집합 및 문자 이스케이프

문자 집합은 모든 작업에 영향을 미치고 보안 영향을 포함하므로 이해하고 정의해야 합니다. 예를 들어, 이스케이프 메커니즘(예: mysqli의 경우 mysqli_real_escape_string() 및 PDO_MySQL의 경우 PDO::quote())은 이 설정을 따릅니다. 이러한 함수는 쿼리로 정의된 문자 집합을 사용하지 않으므로 예를 들어 다음은 해당 함수에 영향을 미치지 않는다는 점을 이해하는 것이 중요합니다.

예제 #1 SQL로 문자 집합을 설정할 때의 문제

                  
<?php

$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

// Will NOT affect $mysqli->real_escape_string();
$mysqli->query("SET NAMES utf8mb4");

// Will NOT affect $mysqli->real_escape_string();
$mysqli->query("SET CHARACTER SET utf8mb4");

// But, this will affect $mysqli->real_escape_string();
$mysqli->set_charset('utf8mb4');

// But, this will NOT affect it (UTF-8 vs utf8mb4) -- don't use dashes here
$mysqli->set_charset('UTF-8');
?>
                  
                

다음은 각 API를 사용하여 런타임에 문자 집합을 올바르게 변경하는 방법을 보여주는 예입니다.

참고: UTF-8 혼동 가능성

MySQL의 문자 집합 이름에는 대시가 포함되어 있지 않기 때문에 문자열 "utf8"은 MySQL에서 문자 집합을 UTF-8(최대 3바이트 UTF-8 유니코드 인코딩)로 설정하는 데 유효합니다. "UTF-8"을 사용하면 문자 집합을 변경하지 못하고 오류가 발생하므로 문자열 "UTF-8"은 유효하지 않습니다.

예제 #2 문자 집합 설정 예: mysqli

                  
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

echo 'Initial character set: ' . $mysqli->character_set_name() . "\n";

if (!$mysqli->set_charset('utf8mb4')) {
    printf("Error loading character set utf8mb4: %s\n", $mysqli->error);
    exit;
}

echo 'Your current character set is: ' . $mysqli->character_set_name() . "\n";
?>
                  
                

예제 #3 문자 집합 설정 예: pdo_mysql

                  
<?php
$pdo = new PDO("mysql:host=localhost;dbname=world;charset=utf8mb4", 'my_user', 'my_pass');
?>