Настройка набора символов на MySQL-соединении не работает

Я пытаюсь установить очень простой переменная сеанса связи на 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 Заявление не оказало влияния.

1

Решение

Вы должны использовать 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;

Эти операторы изменяют только переменные сеанса.

0

Другие решения

Вы устанавливаете кодировку для сеанса (не глобального). Пытаться

SHOW SESSION VARIABLES WHERE ...

Обратите внимание, что с PDO вы можете установить набор символов как часть DSN:

$pdo = new \PDO("mysql:host=localhost;charset=utf8mb4", "root", "");
1