UTF8 最初设计编码最长时 6 字节。2002 年 MySQL 觉得 3 字节就足够了,于是写死 UTF8 最长 3 字节存储。2003 年的 UTF8 新标准,规定最长是 4 字节编码。但没有问题,毕竟 4 字节的 UTF8 字符还没有出现。
UTF-16有大小端的问题(UTF-16LE,UTF-16BE),烦得要死。然后为了这个问题发明了一个BOM,成功地在解决1个问题的同时又引入了10个新问题。最初固定 3 字节,以后可能不够用。4 字节的 UTF-32 考虑了对齐,并留有扩展余地。
再后来智能手机出现,推动 Unicode 标准添加了大量的 Emoji 符号,3 字节就不够用了。MySQL 为了存储这些 Emoji 符号(和一些偏僻字符),但又不能打破兼容,只能再弄出了个 utf8mb4(最长 4 字节存储)。MySQL 中的 utf8 并非正确的 utf8,utf8mb4 才是正确的 utf8。这样就很尴尬了。