mysql使用utf8mb4

mysql使用
参考网址:
#rd
记得去年我在往MySQL存入emoji表情时 , 一直出错 , 无法导入 。后来找到办法 – 通过把 utf8 改成就可以了 , 并没有深究 。
一年后 , 我看到一篇文章讲到emoji文字占4个字节 , 通常要用utf-8去接收才行 , 其他编码可能会出错 。我突然想到去年操作MySQL把utf8改成的事儿 。
嗯?他本身不就是utf8编码么!那我当时还改个锤子?
难道 , MySQL的utf8不是真正的UTF-8编码吗??! 卧槽这 。。MySQL有bug!
带着疑问查询了很多相关材料 , 才发现这竟然是MySQL的一个历史遗留问题~~ 我笑了 , 没想到这么牛B的MySQL也会有这段往事 。
一、报错回顾
将emoji文字直接写入SQL中 , 执行语句报错;
INSERT INTO `csjdemo`.`student` (`ID`, `NAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`)VALUES ('20', '陈哈哈', '男', '20', '181班', '9年级', '看片儿');
[Err] 1366 -value: ‘\xF0\x9F\x98\x93’ for‘NAME’ at row 1
【mysql使用utf8mb4】改了数据库编码、系统编码以及表字段的编码格式 →之后 , 就可以了:
INSERT INTO `student` (`ID`, `NAME`, `SEX`, `AGE`, `CLASS`, `GRADE`, `HOBBY`)VALUES (null, '陈哈哈', '男', '20', '181班', '9年级', '看片儿');
二、MySQL中utf8的趣事
MySQL 的“utf8”实际上不是真正的 UTF-8 。
在MySQL中 , “utf8”编码只支持每个字符最多三个字节 , 而真正的 UTF-8 是每个字符最多四个字节 。
在utf8编码中 , 中文是占3个字节 , 其他数字、英文、符号占一个字节 。
但emoji符号占4个字节 , 一些较复杂的文字、繁体字也是4个字节 。所以导致写入失败 , 应该改成 。
如上图中所示 , 这是编码改成后入库的数据 , 大家可以清晰的对比一下所占的字符数、字节数 。正因如此 , 4字节的内容往utf8编码中插入 , 肯定是不行的 , 插不进去啊 , 是吧(大潘摊手) 。
MySQL 一直没有修复这个 bug , 他们在 2010 年发布了一个叫作“”的字符集 , 巧妙的绕过了这个问题 。
当然 , 他们并没有对新的字符集广而告之(可能是因为这个 bug 让他们觉得很尴尬) , 以致于现在网络上仍然在建议开发者使用“utf8” , 但这些建议都是错误的 。
1.才是真正的UTF-8
是的 , MySQL 的“”才是真正的“UTF-8” 。
MySQL 的“utf8”是一种“专属的编码” , 它能够编码的字符并不多 。
在这里Mark一下:所有在使用“utf8”的 MySQL 和用户都应该改用“” , 永远都不要再使用“utf8” 。
那么什么是编码?什么是 UTF-8?
我们都知道 , 计算机使用 0 和 1 来存储文本 。比如字符“C”被存成“” , 那么计算机在显示这个字符时需要经过两个步骤:
计算机读取“” , 得到数字 67 , 因为 67 被编码成“” 。计算机在字符集中查找 67 , 找到了“C” 。
同样的:
我的电脑将“C”映射成字符集中的 67 。我的电脑将 67 编码成“” , 并发送给 Web 服务器 。
几乎所有的网络应用都使用了字符集 , 因为没有理由使用其他字符集 。
字符集包含了上百万个字符 。最简单的编码是 UTF-32 , 每个字符使用 32 位 。这样做最简单 , 因为一直以来 , 计算机将 32 位视为数字 , 而计算机最在行的就是处理数字 。但问题是 , 这样太浪费空间了 。