我试图在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
声明没有影响。
2条答案
按热度按时间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”语句等价于以下三种语句:
这些语句只更改会话变量。
fykwrbwg2#
您正在设置会话的字符集(不是全局的)。尝试
请注意,使用pdo可以将字符集设置为dsn的一部分: