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

k5ifujac  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(277)

我试图在mysql上设置一个非常简单的会话连接变量,但它什么也做不了。下面运行的查询不会导致任何错误,但mysql连接的字符集不会更改。如果在中为“collation\u server”和“character\u set\u 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 声明没有影响。

7uzetpgm

7uzetpgm1#

你必须使用 SHOW SESSION VARIABLES 看到变化,而不是 SHOW GLOBAL VARIABLES . SET NAMES 不会改变全局变量。它只更改当前会话的字符集变量。
https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html 说:
set names“charset\u name”语句等价于以下三种语句:

SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;

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

fykwrbwg

fykwrbwg2#

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

SHOW SESSION VARIABLES WHERE ...

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

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

相关问题