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/myf修改为:
[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保存昵称特殊字符的⽅法,希望对⼤家有所帮助,如果⼤家有
任何疑问请给我留⾔,⼩编会及时回复⼤家的。在此也⾮常感谢⼤家对⽹站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。