在 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;
这些语句仅更改会话变量。
我试图在 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;
这些语句仅更改会话变量。