在 MySQL 中使用 utf8mb4

Using utf8mb4 in MySQL

为了在MySQL(5.6.11)中使用4字节utf8mb4,我在my.ini文件中设置了以下变量(my.cnf是未找到)。此文件位于 Windows XP 上名为 Application Data (C:\Documents and Settings\All Users\Application Data\MySQL\MySQL Server 5.6) 的隐藏文件夹中。安装目录下没有。

[client]
port=3306
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
init-connect='SET NAMES utf8mb4'
collation_server=utf8mb4_unicode_ci
character_set_server=utf8mb4

然后发出以下命令,

SHOW VARIABLES
WHERE Variable_name
LIKE 'character\_set\_%'
OR Variable_name LIKE 'collation%';

仍然显示以下列表。

从图片本身可以看出,有几个变量还在使用3字节utf8


在执行此操作之前,已发出以下命令以对数据库本身进行相应的更改。

ALTER DATABASE database_name
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

并且在上述数据库中的每个 table 上也发出了以下命令。

ALTER TABLE table_name
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

但是,为什么有些变量还没有设置为上述字符集和排序规则?缺少什么?

系统(操作系统)本身在执行完上述指定的每项任务后重新启动。

客户端通常在连接时设置这些值。 my.ini 中的设置仅仅是默认值,适用于客户端未明确指定连接编码的情况。由于它们不可靠,每个客户端 应该 指定连接编码。因为你有一些漂亮的屏幕截图,我猜你正在连接一些 GUI 实用程序,它可能明确 确实 设置了一些连接编码。

PHP设置连接字符集的例子:

new PDO('mysql:host=localhost;charset=utf8mb4')

我认为您是以 root 身份连接的,因此 init-connect='SET NAMES utf8mb4' 没有执行。

对任何应用程序代码使用root(或SUPER)是不明智的;仅用于管理操作。

如果显示全局变量,您可能会发现所有设置实际上都是正确的。

SHOW GLOBAL VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

这可能与此有关bug 我过去也遇到过同样的问题。我将数据库字符集从 utf8 更改为 utf8mb4。直接从 mysql 命令行执行查询没问题,但我在使用 Workbench 插入表情符号时遇到问题。我最终通过 运行

手动设置了它

SET NAMES 'utf8mb4'

每次我使用 Workbench 打开与我的数据库的连接时。

使用 Sequel Pro 作为替代也很好。

在 win7 上

  1. 使用"win + R"并输入"services.msc"

  2. 查找 mysql

  3. 的服务
  4. 检查文件路径。它会告诉你 my.ini

  5. 在哪里
  6. 打开并添加一些属性:

    [客户] 默认字符集 = utf8mb4

    [mysql] 默认字符集 = utf8mb4

    [mysqld] 字符集客户端握手 = FALSE 字符集服务器 = utf8mb4 归类服务器 = utf8mb4_unicode_ci

  7. 重新启动 mysql 服务