在 MySQL 连接上设置字符集不起作用

Setting character set on MySQL connection does not work

我试图在 MySQL 上设置一个非常简单的 session connection variable,但它没有任何作用。下面的查询 运行 不会导致任何错误,但不会更改 MySQL 连接的字符集。如果我在 my.ini 文件中将 'collation_server' 和 'character_set_server' 的默认值配置为 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 WHERE ...

请注意,使用 PDO,您可以将字符集设置为 DSN 的一部分:

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

您必须使用 SHOW SESSION VARIABLES 才能看到更改,而不是 SHOW GLOBAL VARIABLES

SET NAMES 不会更改 GLOBAL 变量。它只会更改当前会话的字符集变量。

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;

这些语句仅更改会话变量。