php - 使用 SET NAMES utf8mb4 和 utf8 表
问题描述
在基于 Mysql 5.5.57 Php 5.6.37 设置的大型系统中
目前整个系统在 utf8 中工作,包括在每个 db 连接开始时的 SET NAMES utf8。
我需要在其中一张表中支持表情符号,所以我需要将其切换为 utf8mb4。我不想切换其他表。
我的问题是 - 如果我为所有连接(utf8 和 utf8mb4)更改为 SET NAMES utf8mb4 并将特定表仅切换为 utf8mb4(并且仅将 mb4 数据写入此表)。系统的其余部分会像以前一样工作吗?
在 utf8 表/数据/连接中使用 SET NAMES utf8mb4 会不会有任何问题?
解决方案
SET NAMES utf8mb4
我认为使用所有连接应该没有问题。
(在 MySQLutf8mb3
中是 的同义词utf8
;为了清楚起见,我将使用前者。)
utf8mb3
是 的子集utf8mb4
,因此无论哪种方式,您的客户的字节都会很高兴(表情符号除外,它需要 utf8mb4)。当字节到达(或来自)仅声明的列时,将进行检查以验证您没有存储表情符号或某些汉字,否则,它会以最小的方式进行。
我建议
ALTER TABLE ... CONVERT TO utf8mb4
作为转换表格的“正确”方式。但是,它会转换所有varchar/text 列。这可能很糟糕...
如果您JOIN
将转换表转换为未转换表,那么您将尝试将 utf8mb3 字符串与 utf8mb4 字符串进行比较。MySQL 将举手并将所有行从一个转换为另一个。那是没有INDEX
将是有用的。
所以...请确保至少对涉及的任何列JOINs
保持一致。
推荐阅读
- amazon-web-services - 在 AWS API Gateway 中激活 CORS 时出现错误
- f# - 如何将多参数 F# 函数分配给 C# 变量?
- scala - 定义枚举时的“值”是什么
- javascript - heroku 在构建依赖项时不使用 babel 编译代码
- pdf - 蓝色棱镜 - 保存和阅读 Pdf
- python - 每次调用函数时,打印语句都不会打印到控制台
- php - 如何使用 php 在控制台应用程序中重新加载 phpunit
- typescript - 为什么将“任何”类型的对象设置为具有特定类型的属性不会引发 TS 编译错误?
- uwp - UWP 应用 Google 身份验证适用于桌面,但不适用于 Xbox One
- powershell - 通过触发器运行时计划作业失败,但在手动运行时有效