Я пытаюсь установить очень простой переменная сеанса связи на MySQL, но это ничего не делает. Запросы, выполняемые ниже, не вызывают никаких ошибок, но набор символов соединения MySQL не будет изменен. Если я настрою значения по умолчанию для ‘collation_server’ и ‘character_set_server’ в my.ini
подать как utf8mb4
вместо latin1
то набор символов становится utf8mb4
, но мне интересно, почему я не могу изменить набор символов подключения из моего сценария PHP.
$pdo = new \PDO("mysql:host=localhost", "root", "");
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$pdo->query("SET NAMES utf8mb4");
print_r($pdo->query("SHOW GLOBAL VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';")->fetchAll(PDO::FETCH_ASSOC));
Этот запрос показывает, что SET NAMES
Заявление не оказало влияния.
Вы должны использовать SHOW SESSION VARIABLES
чтобы увидеть изменения, а не SHOW GLOBAL VARIABLES
,
SET NAMES
не меняет глобальные переменные. Это только изменяет переменные набора символов для вашего текущего сеанса.
https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html говорит:
Оператор SET NAMES ‘charset_name’ эквивалентен этим трем операторам:
SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;
Эти операторы изменяют только переменные сеанса.
Вы устанавливаете кодировку для сеанса (не глобального). Пытаться
SHOW SESSION VARIABLES WHERE ...
Обратите внимание, что с PDO вы можете установить набор символов как часть DSN:
$pdo = new \PDO("mysql:host=localhost;charset=utf8mb4", "root", "");