最近在写一个爬虫的多线程脚本,在异步插入数据库的时候总有部分数据插入失败,原因竟然是编码的问题。扪心自问,mysql最通用的中文字符编码就是utf-8了,通常情况下,utf-8作为中文编码是司空见惯的,但是还是一如既往的写入数据库失败。

    原来MySQL在5.5.3版本之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。其实,utf8mb4是utf8的超集,理论上原来使用utf8,然后将字符集修改为utf8mb4,也会不会对已有的utf8编码读取产生任何问题。当然,为了节省空间,一般情况下使用utf8也就够了。低版本的MySQL支持的utf8编码,最大字符长度为 3 字节,如果遇到 4 字节的字符就会出现错误了。

    UTF-8 最大能编码的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是说,任何不在基本多文平面的 Unicode字符,都无法使用MySQL原有的 utf8 字符集存储。这些不在BMP中的字符包括哪些呢?最常见的就是Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和一些不常用的汉字,以及任何新增的 Unicode 字符等等。理论上讲, UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8,事实上,最新版的phpmyadmin默认字符集就是utf8mb4。诚然,对于 CHAR 类型数据,使用utf8mb4 存储会多消耗一些空间。

最新文章

  1. Leetcode 第一遍刷完
  2. C#如何在事件中获得GridView里面TextBox的值
  3. import static与import的区别
  4. CSS 实现背景半透明
  5. app 测试点
  6. 反射操作辅助类ReflectionUtil
  7. 异常处理 - PHP手册笔记
  8. tabbar动画切换
  9. android开发艺术探索读书笔记之-------view的事件分发机制
  10. JavaScript基礎知識
  11. C# 我的小画板
  12. Java并发编程(十一)线程池的使用
  13. 格林第一季/全集Grimm迅雷下载
  14. Linux如何实现开机启动程序详解(转)
  15. 关于ddx/ddy重建法线在edge边沿上的artifacts问题
  16. PHP 连接oracle
  17. Python_oldboy_自动化运维之路_全栈考试(五)
  18. 【8.13校内测试】【DP】【按除数分类】【二分】
  19. 《Clean Code》一书回顾
  20. nodejs报错 XMLHttpRequest cannot load localhost:3000/test_date/. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https.

热门文章

  1. JS,JQuery小知识
  2. ECS上nginx搭建反向代理通过内网访问阿里云OSS服务
  3. C# Winform ComBox三种赋值方式
  4. Gradle 简记
  5. Generator
  6. Testlink与MantisBT集成
  7. Vue小项目二手书商城:(五)参考资料
  8. shell date命令
  9. mybatis-generator 自动生成mapper以及实体类
  10. Qt551.主窗体Margin