【问题标题】:Using utf8mb4 in MySQL在 MySQL 中使用 utf8mb4
【发布时间】:2015-04-16 22:12:25
【问题描述】:

为了在 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;

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

ALTER TABLE table_name
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

但是,为什么某些变量尚未设置为所述字符集以及排序规则的原因是什么?缺少什么?

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

【问题讨论】:

  • 警告:user=root(或其他超级用户)不会执行init-connect='SET NAMES utf8mb4'

标签: mysql utf-8 character-encoding mysql-5.6 utf8mb4


【解决方案1】:

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

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

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

【讨论】:

  • 那么,他们基本不用担心吗?我从 Java 端创建了一个连接池,其中设置了一些参数,例如 characterEncoding 设置为 UTF-8useUnicode 设置为 truecharacterSetResults 设置为 UTF-8。它们基本上用于附加到具有相同名称/值对的连接字符串的参数的目的。 (截图取自 MySQL WorkBench。MySQL 终端由于一些不清楚的原因一直没有打开,因为安装了 MySQL。它只是闪烁了一会儿,然后在双击 mysql.exe 时消失了。所以,我使用 WorkBench)
  • 如果您的实际客户端要声明自己的utf8mb4 连接编码,那么是的,不用担心。您根本不需要触摸 my.ini 即可获得 utf8mb4 工作流程。
  • 我可以设法以某种方式启动 MySQL 命令行。当使用skip-character-set-client-handshake 时,它只会将这些值设置为utf8mb4。在 MySQL WorkBench 上,它需要发出手动命令 SET NAMES 'utf8mb4';,它将所有这些值转换为 utf8mb4,但仍将 collation_connection 保留为其值 utf8mb4_general_ci。另一方面,character_set_system 在所有情况下对utf8 保持静止。
  • @Tiny 以任何方式将 Mysql Workbench 配置为默认使用 utf8mb4,因此每次连接时都不需要发出 SET names utf8mb4?
【解决方案2】:

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

对任何应用程序代码使用 root(或 SUPER)是不明智的;仅用于行政行为。

【讨论】:

  • 我无处可读,“对任何应用程序代码使用 root(或 SUPER)是不明智的”。我将“应用程序代码”解释为客户端应用程序,例如 Java/PHP/ASP.NET 或其他东西。这是否意味着一个人应该始终坚持创建另一个/其他用户,如果一个人希望通过客户端应用程序使用 MySQL,而客户端应用程序应该从另一个用户而不是 root 用户访问数据库?
  • 这是一个普遍的安全问题。如果黑客可以进入客户端并发现 root 密码,那么他不仅可以破坏数据库,还可能破坏数据库所在的机器。而且,如果您有多个用户,最好在他们之间进行一定程度的隔离。 应用程序代码是指最终用户(通常根本不应该有 mysql 登录)和代表他们行事的应用程序层(Java 等)。
  • 而且,也许,您发现了关于 root 跳过 init-connect 的鲜为人知的警告?
  • 当使用skip-character-set-client-handshake 时,utf8mb4 似乎已设置。我什至不知道它是什么意思(我认为不鼓励使用它)。 RDBMS 是远远超出我的东西 :)
【解决方案3】:

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

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 作为替代方案也很好。

【讨论】:

    【解决方案4】:

    在win7上

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

    2. 找到mysql的服务

    3. 检查文件路径。它会告诉你 my.ini 的位置

    4. 打开并添加一些属性:

      [客户端] 默认字符集 = utf8mb4

      [mysql] 默认字符集 = utf8mb4

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

    5. 重启mysql服务

    【讨论】:

      猜你喜欢
      • 2021-08-05
      • 2017-03-27
      • 1970-01-01
      • 2021-01-10
      • 2017-07-10
      • 1970-01-01
      • 1970-01-01
      • 2018-01-27
      相关资源
      最近更新 更多