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

时间:2018-04-15 13:24:13

标签: php mysql character-set

我试图在MySQL上设置一个非常简单的session connection variable,但它没有做任何事情。下面运行的查询不会导致任何错误,但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语句没有影响。

2 个答案:

答案 0 :(得分:1)

您正在为会话设置charset(非全局)。尝试

SHOW SESSION VARIABLES WHERE ...

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

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

答案 1 :(得分:1)

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

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

https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html说:

A SET NAMES' charset_name'声明等同于这三个陈述:

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

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