我们的一些业务系统最近出现了一种情况,尤其是新版的ios 设备,在发布消息时,使用了表情符号时,

 
对gbk 字符集的数据库,写入数据库的数据,在回显时,变成 ‘口口’ 无法回显,
 
对utf8 字符集的数据库,则根本无法写入数据库,客户端程序直接报 java.io.exception xxxxxxxx. 
  
 
 
原因在哪里呢? 
 
 
各种移动设备,各种不同的输入法,都会自带一些增强版的'bmp' 表情符号。 
 
这些表情符号编码为 4个字节的 字符,  utf8 字符集目前只支持1-3 个字节的字符,导致数据无法入库。 
 
解决方案  有两种: 
 
1.  遍历输入的文本,把四字节长度的字符,修正为自定义的字符替换掉,有一定的工作量。 
 
2.  修改数据库字符集, 把数据库字符集从utf8 修改为支持1-4 个字节字符的utf8mb4 
 
     mysql 从 5.5.3 版本开始支持 utf8mb4 字符集 , 从 mysql 5.5.3 之后版本基本可以无缝升级到 utf8mb4 字符集。 
 
3.升级方案: 
 
1)  修改数据库字符集character-set-server=utf8mb4   重启数据库生效。 
       [mysqld]
       character-set-server=utf8mb4
       
 
2)  修改database  的字符集为 utf8mb4
       alter  database  dbname  character  set=utf8mb4 
 
3)    修改表的字符集   为utf8mb4 
       alter  table tablename character set = utf8mb4 
 
 
4. 需要注意的一些点。 
 
 1)  innodb 索引只能支持 767 的字节,对utf8 大约可以为255 字符做索引,  对utf8mb4 就只有 191 个字符了,你的索引可能要重新定义。 
 
2) 你的char  varchar 的字段定义可能要重新定义或者修改为 text 类型。 
 
3)  utf8mb4 是utf8 的一个超集, utf8 字符的编码,位置, 存储  在utf8mb4 与utf8 字符集里一样的,不会对有现有数据带来损坏。 
 
4) 谨慎起见,请详细测试你的应用对该字符集的兼容性问题。 
 
 
 
字符集设置:
 
mysql>  SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+-----------------+
| Variable_name | Value |
+--------------------------+-----------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| collation_connection | utf8_general_ci |
| collation_database | utf8_general_ci |
| collation_server | utf8_general_ci |
+--------------------------+-----------------+
10 rows in set (0.20 sec)
 
mysql> SET character_set_client = gbk;
Query OK, 0 rows affected (0.31 sec) mysql> SET character_set_connection=gbk ;
Query OK, 0 rows affected (0.00 sec) mysql> set character_set_database=utf8mb4;
Query OK, 0 rows affected (0.00 sec) mysql> set character_set_filesystem=binary;
Query OK, 0 rows affected (0.00 sec) mysql> set character_set_results=gbk;
Query OK, 0 rows affected (0.00 sec)

mysql> set character_set_system=utf8;
  ERROR 1238 (HY000): Variable 'character_set_system' is a read only variable

mysql> set names gbk;

它相当于下面的三句指令:
SET character_set_client = gbk;
SET character_set_results = gbk;
SET character_set_connection = gbk;
SET NAMES 'charset_name' COLLATE 'collation_name'
[client]     //通过连接器连接 EG:PHP

[mysql]      //mysql程序登陆时的字符集

default-character-set    = gbk
//等价
--SET character_set_client     = gbk;
--SET character_set_results    = gbk;
--SET character_set_connection = gbk;

#character_set_system=utf8mb4
#character_set_client=utf8mb4
#character_set_connection=utf8mb4
#character_set_database=utf8mb4
#character_set_results=utf8mb4 // #代表相应变量不能设置在这个区中,报错,mysql登陆报错
[mysqld]   //mysqld起动时设置字符集
character_set_filesystem=binary
character-set-server=utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='set autocommit=0; set names gbk;' //root 用户不会执行
 

#character_set_system=utf8mb4
#character_set_client=utf8mb4
#character_set_connection=utf8mb4 //#代表相应变量不能设置在这个区中,mysqld 起动报错
#character_set_database=utf8mb4
#character_set_results=utf8mb4 []

[client]
default-character-set = utf8 [mysqld]
default-storage-engine = INNODB
character-set-server = utf8
collation-server = utf8_general_ci
 

mysql> select * from t1;
+------------+-----------------+---------------------+
| cur_user | n_user | in_time |
+------------+-----------------+---------------------+
| @localhost | mysql@localhost | 2016-07-05 00:25:02 |
+------------+-----------------+---------------------+
1 row in set (0.19 sec) mysql> ALTER TABLE t1 MODIFY cur_user CHAR(50) CHARACTER SET sjis; mysql> show create table t1;
CREATE TABLE `t1` (
`cur_user` char(50) CHARACTER SET sjis DEFAULT NULL,
`n_user` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
`in_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

http://imysql.cn/2013/10/29/misunderstand-about-charset-handshake.shtml

character-set-client-handshake=1

Do not ignore character set information sent by the client. To ignore client information and use the default server character set,
use --skip-character-set-client-handshake; this makes MySQL behave like MySQL 4.0.
utf8mb4 字符集:
MySQL支持Emoji表情,涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集。

utf8mb4和utf8到底有什么区别呢?原来以往的mysql的utf8一个字符最多3字节,而utf8mb4则扩展到一个字符最多能有4字节,所以能支持更多的字符集。

解决方案:将Mysql的编码从utf8转换成utf8mb4。

需要 >= MySQL 5.5.3版本、从库也必须是5.5的了、低版本不支持这个字符集、复制报错

停止MySQL Server服务

修改 my.cnf或者mysql.ini

[client]
default-character-set = utf8mb4 [mysql]
default-character-set = utf8mb4 [mysqld]
character-set-client-handshake = 0
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4' 重启 MySQL Server、检查字符集 mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%'; 修改数据库字符集: ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; 修改表的字符集: ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 修改字段的字符集: ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 如果只是某个字段需要 只需要修改那个字段的字符集就可以了 另外服务器连接数据库 Connector/J的连接参数中,不要加characterEncoding参数。 不加这个参数时,默认值就时autodetect。

my.cnf 中字符集设置的更多相关文章

  1. Mysql字符集设置

    转 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodi ...

  2. mysql配置命令 CHARACTER_SET_%字符集设置

    参照: http://blog.csdn.net/mzlqh/article/details/7621307点击打开链接 其实现在的ubuntu12. 直接sudo apt-get install M ...

  3. mysql 字符集设置查看

    1.列出MYSQL支持的所有字符集: SHOW CHARACTER SET; 2.当前MYSQL服务器字符集设置 SHOW VARIABLES LIKE 'character_set_%'; 3.当前 ...

  4. Mysql字符集设置 2 图

    基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如'A'.'B'等: • 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodin ...

  5. mac下mysql5.6字符集设置

    http://geeksblog.cc/2016/05/28/mac-mysql-unicode/   mac下mysql5.6字符集设置: 在mac下设置mysql5.6字符集时踩过的坑,百分百保证 ...

  6. java 访问 mysql 数据库的字符集设置

    mysql是在linux下,java代码通过jdbc访问总是中文乱码.做过如下尝试: 1)修改 mysql的 my.cnf文件,设置 default-character-set等参数 2) 利用alt ...

  7. MySQL字符集设置—MySQL数据库乱码问题

    MySQL(4.1以后版本) 服务器中有六个关键位置使用了字符集的概念,他们是:client .connection.database.results.server .system.MySQL有两个字 ...

  8. [mysql]深入Mysql字符集设置[转载]

    http://www.laruence.com/2008/01/05/12.html 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等: • 给定一系列字符, ...

  9. 深入Mysql字符集设置

    作者: Laruence(   ) 本文地址: http://www.laruence.com/2008/01/05/12.html 转载请注明出处 根据Chaos  Wang的PPT整理而成, 在此 ...

随机推荐

  1. ANDROID_MARS学习笔记_S01原始版_023_MP3PLAYER003_播放mp3

    一.简介 1.在onListItemClick中实现点击条目时,跳转到PlayerActivity,mp3info通过Intent传给PlayerActivity 2.PlayerActivity通过 ...

  2. 145. Binary Tree Postorder Traversal

    题目: Given a binary tree, return the postorder traversal of its nodes' values. For example:Given bina ...

  3. leetcode面试准备:Add and Search Word - Data structure design

    leetcode面试准备:Add and Search Word - Data structure design 1 题目 Design a data structure that supports ...

  4. Layout Resource官方教程(3)在layout中用include嵌入其它layout

    简介 <include>Includes a layout file into this layout. 类似 #include ,把layout展开在include处 attribute ...

  5. 【HDOJ】1050 Moving Tables

    贪心问题,其实我觉得贪心就是合理的考虑最优情况,证明贪心可行即可.这题目没话多久一次ac.这道题需要注意房间号的奇偶性.1 3.2 4的测试数据.答案应该为20. #include <stdio ...

  6. hadoop 原理: 浅析Hadoop文件格式

    Hadoop 作为MR 的开源实现,一直以动态运行解析文件格式并获得比MPP数据库快上几倍的装载速度为优势.不过,MPP数据库社区也一直批评Hadoop由于文件格式并非 为特定目的而建,因此序列化和反 ...

  7. Linux Kernel KVM 'apic_get_tmcct()'函数拒绝服务漏洞

    漏洞版本: Linux Kernel 漏洞描述: Bugtraq ID:64270 CVE ID:CVE-2013-6367 Linux Kernel是一款开源的操作系统. Linux KVM LAP ...

  8. 原生APP与移动Web App的比较

    中国手机网民已超4.5亿,智能机用户超过3.8亿,中国移动互联网市场产值已超过712.5亿元,手机营销是未来必然趋势,而App恰恰是这个趋势下的一个强有力的营销工具: App已有两个主要的方向:原生A ...

  9. REST Web 服务介绍

    在项目上使用到了Rest技术,应该是Rest的服务概念才对.主要是对外(BPM)暴露API来提供Service.推荐一篇有质量的文章,接下来会系统一点的学习一下Restful概念.http://kb. ...

  10. java基础之运算符

    运算符是用于表示数据的赋值,运算和比较的一种特殊符号.1.赋值运算符:=,+=,-=,*=,/=,%= x=1;x+=2;(相当于x=x+2,等于3),其他运算符同理 2.算术运算符:+,-,*,/, ...