千家信息网

mysql保存微信昵称特殊字符的方法

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,我在用mysql 保存微信昵称,当插入昵称数据的时候,报错。于是做了如下工作:一、简介MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四
千家信息网最后更新 2025年11月07日mysql保存微信昵称特殊字符的方法

我在用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.sockdefault-character-set=utf8mb4 # Here follows entries for some specific programs # The MySQL server [mysqld] port      = 3306 socket     = /usr/local/mysql/data/mysql.sockcharacter-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.sockdefault-character-set=utf8mb4

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

[mysqld]character-set-client-handshake=FALSEcharacter-set-server=utf8mb4collation-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保存微信昵称特殊字符的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

字符 字节 长度 编码 UTF-8 支持 最大 字符集 平面 字符串 数据 昵称 最长 三个 也就是 就是 版本 特殊 兼容性 文本 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 浙江前端软件开发如何收费 开平区电子网络技术售后服务 青花瓷钢琴谱软件开发 人为疏忽造成网络安全 保融科技笔试数据库题目 手机有时候无法连接服务器 服务器设备的数据安全与备份 网络安全法第四十四条条文 2017年新数据库 t6未与数据库关联 手机十三水软件开发 安徽省网络安全信息化委员会 网络安全教育总结图片 处对象有什么软件开发 阿里云会监控数据库吗 计算机网络技术的人生规划 网络安全保障工作隐患排查 福建的互联网科技巨头 计算机网络技术概述课堂提问 网络安全法则有哪些行为禁止 灵石县煤气化网络安全招标 注册数据库驱动 云徕上海互联网科技 网络安全的班会效果 98一年的阿里云服务器怎么用 数字网络安全防线 互联网之光博览会网络安全 外包软件开发管理办法 pad系统数据库导出来 泰兴小型网络技术价格查询
0