3

我试图在 MySQL 上设置一个非常简单的会话连接变量,但它什么也没做。下面运行的查询不会导致任何错误,但不会更改 MySQL 连接的字符集。my.ini如果我在文件中将'collat​​ion_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语句没有影响。

4

2 回答 2

1

您正在为会话设置字符集(不是全局的)。尝试

SHOW SESSION VARIABLES WHERE ...

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

$pdo = new \PDO("mysql:host=localhost;charset=utf8mb4", "root", "");
于 2018-04-15T13:40:40.170 回答
1

您必须使用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;

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

于 2018-04-15T13:41:42.110 回答