我在用mysql 保存微信昵称,当插入昵称数据的时候,报错。于是做了如下工作:

一、简介

MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

二、内容描述

那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。

三、问题根源

最初的 UTF-8 格式使用一至六个字节,最大能编码 31 位字符。最新的 UTF-8 规范只使用一到四个字节,最大能编码21位,正好能够表示所有的 17个 Unicode 平面。

utf8 是 Mysql 中的一种字符集,只支持最长三个字节的 UTF-8字符,也就是 Unicode 中的基本多文本平面。

Mysql 中的 utf8 为什么只支持持最长三个字节的 UTF-8字符呢?我想了一下,可能是因为 Mysql 刚开始开发那会,Unicode 还没有辅助平面这一说呢。那时候,Unicode 委员会还做着 “65535 个字符足够全世界用了”的美梦。Mysql 中的字符串长度算的是字符数而非字节数,对于 CHAR 数据类型来说,需要为字符串保留足够的长。当使用 utf8 字符集时,需要保留的长度就是 utf8 最长字符长度乘以字符串长度,所以这里理所当然的限制了 utf8 最大长度为 3,比如 CHAR(100)  Mysql 会保留 300字节长度。至于后续的版本为什么不对 4 字节长度的 UTF-8 字符提供支持,我想一个是为了向后兼容性的考虑,还有就是基本多文种平面之外的字符确实很少用到。

要在 Mysql 中保存 4 字节长度的 UTF-8 字符,需要使用 utf8mb4 字符集,但只有 5.5.3 版本以后的才支持(查看版本: select version();)。我觉得,为了获取更好的兼容性,应该总是使用 utf8mb4 而非 utf8.  对于 CHAR 类型数据,utf8mb4 会多消耗一些空间,根据 Mysql 官方建议,使用 VARCHAR  替代 CHAR。

具体如何操作呢:

一、在MYSQL数据库中,将/usr/local/mysql/my.cnf修改为:

[client]

#password       = your_password

port            = 3306

socket          = /usr/local/mysql/data/mysql.sock

default-character-set=utf8mb4

# Here follows entries for some specific programs

# The MySQL server

[mysqld]

port            = 3306

socket          = /usr/local/mysql/data/mysql.sock

character-set-server=utf8mb4

collation-server=utf8_general_ci

#no-auto-rehash

datadir         =/usr/local/mysql/data

skip-external-locking

key_buffer_size = 16K

max_allowed_packet = 1M

table_open_cache = 4

sort_buffer_size = 64K

read_buffer_size = 256K

read_rnd_buffer_size = 256K

net_buffer_length = 2K

thread_stack = 128K

log_error=/usr/local/mysql/data/mysql-error.log

[mysql]

no-auto-rehash

socket          = /usr/local/mysql/data/mysql.sock

default-character-set=utf8mb4

网上有人说 还要修改成如下:

[mysqld]

character-set-client-handshake=FALSE

character-set-server=utf8mb4

collation-server=utf8mb4_unicode_ci

init-connect='SET NAMES utf8mb4'

我的没有就没修改了

二、修改表列的字符集

例如:alter table users change nickname nickname varchar(50) character set utf8mb4   collate utf8mb4_unicode_ci ;

三、修改连接字符串

JDBC连接串的问题,有些项目在jdbc连接串里指定了编码,例如:jdbc:mysql://localhost/mydb?characterEncoding=UTF-8

微信名称mysql保存_mysql保存微信昵称特殊字符相关推荐

  1. 微信公众 mysql回复图片_微信公众平台开发消息回复总结介绍

    一.简介 微信公众平台提供了三种消息回复的格式,即文本回复.音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用. 二.思路分析 对于每一个PO ...

  2. 微信公众 mysql回复图片_微信公众号开发之微信公共平台消息回复类实例

    本文实例讲述了微信公众号开发之微信公共平台消息回复类.分享给大家供大家参考.具体如下: 微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,这里就给各位 ...

  3. mysql 存储微信昵称乱码_MYSQL 保存微信昵称特殊字符报错解决方法-设置编码集为utf8mb4的方法...

    mysql utf8mb4 保存微信昵称特殊字符报错方法 公众号二次开发,在处理用户昵称的时候发现有的时候一些emoji是4字节的表情无法保存入库,经过查找资料发现是因为字段的编码问题造成的, utf ...

  4. mysql存微信你曾_mysql保存微信昵称特殊字符的方法

    我在用mysql 保存微信昵称,当插入昵称数据的时候,报错.于是做了如下工作: 一.简介 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼 ...

  5. mysql存带表情的微信昵称_MySQL保存 emoji 表情(微信昵称表情)

    问题分析 在微信开发过程中,总是会遇到带有emoji表情昵称的微信用户无法自动登录的问题. 后台代码抛出类似下面的异常信息. java.sql.SQLException: Incorrect stri ...

  6. 微信小程序上传头像和昵称持久化保存

    微信小程序上传头像和昵称持久化保存 1. 持久化步骤 因为通过微信头像昵称填写功能获取到头像是一个临时头像,这个url只能一段时间内在微信访问,并且无法在公网访问这个url.所以非常有必要把这个url ...

  7. mysql保存和读取微信头像

    mysql 保存和读取微信头像 时间:2019年5月5日11:48:44 Util代码: import lombok.extern.slf4j.Slf4j; import javax.sql.rows ...

  8. 微信小程序之生成图片保存到相册

    微信小程序之生成图片保存到相册 需求概要 电商项目中需要将自己小店的商品带上自己的小程序码生成海报,保存到本地,然后分享到万能的朋友圈,QQ空间,微博等等来广而告之- 如下图,三种海报格式轮播展示,左 ...

  9. 修改审查元素怎么保存_[图解]微信公众号链接里的音频保存方法

    第1步,登陆"微信PC版",将含有音频的微信公众号链接发送至"文件传输助手"或者发送给自己,左键单击链接,弹出微信浏览界面 第2步,在微信浏览界面,左键单击按钮 ...

最新文章

  1. 大学计算机专业全英文论文,5计算机专业 外文文献 英文文献 外文翻译 jsp应用框架 中英对照 大学学位论文.doc...
  2. laravel创建新model数据的两种方法
  3. 从hello server开始,到hello client结束
  4. HDU4825 Xor Sum 01字典树(Tire Tree)
  5. Oracle应用容器云上的WildFly Swarm
  6. 如何设置坐标原点值_数控车如何精确对刀,干数控的你们都知道吗?
  7. Linux之-atime、ctime、mtime
  8. ldpcMATLAB/ldpc的译码,matlab程序/LDPC编码的matlab实现/源码
  9. js加html连线实现流程,(jsPlumb开发入门教程实现html5拖拽连线.doc
  10. 2019保研Tips:双非推免南京大学
  11. 多个无线WIFI路由器之间实现不掉线无缝切换的设置方法
  12. 解决0x80070035找不到网络路径
  13. hivesql失败告警发送到企业微信
  14. 电路设计的3W原则、5W原则、3H原则、5H原则、20H原则、五五规则
  15. 基于SSM的仓储管理系统
  16. 【English】Day 2 大英读写2 U1 A 7.11.12 翻译
  17. 英特尔商用客户端焕“芯”,释放数字时代三重生产力
  18. 【转载】CPU散热器详解
  19. 内存导致的电脑游戏中显示hdmi无信号 从而死机的情况
  20. php富友接口对接http请求

热门文章

  1. 对学习过程中的认知和体会
  2. Menu:选项菜单,上下文菜单,弹出式菜单
  3. QT5实现简单的TCP通信Client端
  4. [原创]C# 操作Excel的类
  5. js监测页面关闭发送Ajax请求(浏览器关闭注销用户,清空session)
  6. django的运行命令
  7. BIMBase-Python参数化组件常见问题——安装篇
  8. 运动耳机什么牌子的好、运动耳机排行榜10强
  9. [资源分享] 【Springboot】实例讲解Springboot整合OpenTracing分布式链路追踪系统(Jaeger和Zipkin)
  10. 量化投资之:连27年回率打败巴菲特