MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 6919|回复: 1
打印 上一主题 下一主题

[字符集] MySQL乱码问题以及utf8mb4字符集

[复制链接]
跳转到指定楼层
1#
发表于 2014-9-11 18:36:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
出处:http://afei2.sinaapp.com/?p=518
乱码

推荐大家看深入MySQL字符集设置,区分检查client端、server端的编码;最简单暴力的方式,是在所有的环节都显式明确的指定相同的编码。

比如使用python的MySQLdb连接MySQL时默认的charset是latin1,需要自己指定charset=’utf8′,即使是在服务器端的init-connect=’SET NAMES utf8′,MySQLdb也会使用latin1覆盖该选项;可以参照这篇文章


emoji表情与utf8mb4

关于emoji表情的话mysql的utf8是不支持,需要修改设置为utf8mb4,才能支持,详细emoji表情与utf8mb4的关系

MYSQL 5.5 之前, UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区, BMP是从哪到哪,到http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters这里看,基本就是0000~FFFF这一区。 从MYSQL5.5开始,可支持4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支持更多的字符集。

utf8mb4 is a superset of utf8

utf8mb4兼容utf8,且比utf8能表示更多的字符。


修改方法服务器端

修改数据库配置文件/etc/my.cnf

character-set-server=utf8mb4
collation_server=utf8mb4_unicode_ci

重启MySQL(按照官方文档,这两个选项都是可以动态设置的,但是实际的经验是Server必须重启一下)

已有的表修改编码为utf8mb4

  1. ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
复制代码

使用下面这个语句只是修改了表的default编码

  1. ALTER TABLE etape_prospection CHARSET=utf8;
复制代码

客户端

jdbc的连接字符串不支持utf8mb4,这个这种方式来解决的,如果服务器端设置了character_set_server=utf8mb4,则客户端会自动将传过去的utf-8视作utf8mb4。

  • Connector/J did not support utf8mb4 for servers 5.5.2 and newer.
    Connector/J now auto-detects servers configured withcharacter_set_server=utf8mb4 or treats the Java encoding utf-8 passed using characterEncoding=...as utf8mb4 in the SET NAMES= calls it makes when establishing the connection. (Bug #54175)

其他的client端,比如php、python需要看下client是否支持,如果不能在连接字符串中指定的话,可以在获取连接之后,执行”set names utf8mb4″来解决这个问题;


因为utf8mb4是utf8的超集,理论上即使client修改字符集为utf8mb4,也会不会对已有的utf8编码读取产生任何问题。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
2#
发表于 2014-9-12 09:59:03 | 只看该作者
赞,字符集狠重要啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-4-27 02:42 , Processed in 0.065829 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表