在基于Mysql 5.5.57 Php 5.6.37的大型系统中
当前,整个系统都在utf8中运行,包括在每个数据库连接开始处的SET NAMEs utf8。
我需要在其中一张表中支持表情符号,因此需要将其切换为utf8mb4。 我不想切换其他表格。
我的问题是-如果我将所有连接(utf8和utf8mb4)的设置名称更改为utf8mb4,并将特定表仅切换到utf8mb4(并且仅将mb4数据写入此表)。 系统的其余部分会像以前一样工作吗?
使用utf8表/数据/连接中的SET NAMEs utf8mb4会不会有任何问题?
可能一直复制UTF-8
不是重复的。我询问utf8和utf8mb4的混合用法
就个人而言,Id建议您完全切换到utf8mb4。甚至MySQL团队也声称utf8mb4现在比utf8快得多。参考:mysqlserverteam.com/mysql-8-0-when-to-use-utf8mb3-over-utf8mb4 PS:不是我的作品:-)
PSA:可能需要时间更新到5.6.38,因为5.6.37中存在漏洞。
您应该问的是:"如果这行得通,我希望这成为系统前进的方式吗?刚离开utf8并继续使用utf8mb4会更好吗?如果实现,开发工作和安全性将受到怎样的损害?混合计划?有什么好处?最坏的情况是什么?"
我不想切换所有表的原因是它需要对表进行优化-这是一个大型生产系统。对这种阻止操作不满意。比将所有内容切换到一张桌子更可行
我认为对所有连接使用SET NAMES utf8mb4应该没有问题。
(utf8mb3是MySQL中utf8的同义词;为清楚起见,我将使用前者。)
utf8mb3是utf8mb4的子集,因此您的客户端字节将以两种方式都令人满意(Emoji除外,后者需要utf8mb4)。 当字节到达(或来自)仅声明的列时,将进行检查以确认您没有存储表情符号或某些中文字符,但是否则,它会以最小的麻烦进行。
我建议
ALTER TABLE ... CONVERT TO utf8mb4
作为转换表的"正确"方法。 但是,它将转换所有varchar / text列。 可能不好
如果您将转换后的表JOIN转换为未转换的表,则将尝试将utf8mb3字符串与utf8mb4字符串进行比较。 MySQL将举手并把所有行从一个转换为另一个。 那不是INDEX有用的。
所以...确保至少与JOINs中涉及的任何列保持一致。