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