我们的一些业务系统最近出现了一种情况,尤其是新版的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.31sec)

mysql> SET character_set_connection=gbk ;

Query OK,0 rows affected (0.00sec)

mysql> set character_set_database=utf8mb4;

Query OK,0 rows affected (0.00sec)

mysql> set character_set_filesystem=binary;

Query OK,0 rows affected (0.00sec)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> setnames 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=binarycharacter-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 =INNODBcharacter-set-server =utf8

collation-server = utf8_general_ci

mysql> select * fromt1;+------------+-----------------+---------------------+

| cur_user | n_user | in_time |

+------------+-----------------+---------------------+

| @localhost | mysql@localhost | 2016-07-05 00:25:02 |

+------------+-----------------+---------------------+

1 row in set (0.19sec)mysql> ALTER TABLE t1 MODIFY cur_user CHAR(50) CHARACTER SETsjis;mysql> show create tablet1; 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=1Donot 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 =0character-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 SETutf8mb4 COLLATE utf8mb4_unicode_ci;

修改字段的字符集:ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SETutf8mb4 COLLATE utf8mb4_unicode_ci;

如果只是某个字段需要 只需要修改那个字段的字符集就可以了

另外服务器连接数据库 Connector/J的连接参数中,不要加characterEncoding参数。 不加这个参数时,默认值就时autodetect。

mysql my.cnf 字符集_my.cnf 中字符集设置相关推荐

  1. mysql数据库的字符集_mysql数据库中字符集乱码问题原因及解决

    前言 有的时候我们在查看数据库数据时,会看到乱码.实际上,无论何种数据库只要出现乱码问题,这大多是由于数据库字符集设定的问题. 下面我们就介绍一下,数据库的字符集的设定及乱码问题的解决. mysql数 ...

  2. mac mysql my.cnf 路径_my.cnf文件在macOS上的位置

    通常,在Unix和类似Unix的系统上,MySQL / MariaDB程序在以下位置(按指定顺序)读取config / startup文件: /etc/my.cnf -全球 /etc/mysql/my ...

  3. linux my.cnf基本参数,Linux中MySQL配置文件my.cnf参数说明

    MySQL参数优化这东西不好好研究还是比较难懂的,其实不光是MySQL,大部分程序的参数优化,是很复杂的.MySQL的参数优化也不例外,对于不同的需求,还有硬件的配置,优化不可能又最优选择,只能慢慢的 ...

  4. mysql字符集查看_查看和设置mysql字符集

    http://218.194.248.2/~wuxiaogang/cpcourse/database/mysql/charset.htm 1. 修改mysql的my.cnf # vi /etc/my. ...

  5. mysql 字符集测试_MySQL多字符集备份恢复测试

    目的:测试单mysql实例在多字符集的数据库环境中备份恢复的乱码问题 准备工作: CREATE DATABASE `utf8_db` /*!40100 DEFAULT CHARACTER SET ut ...

  6. mysql 字符集 校验规则_MySQL字符集及校验规则

    1.字符集 # Mysql 的字符集有4个级别的默认设置:服务器级,数据库级,表级和字段级,客户端交互时,也可以指定字符集 # 字符集:是一个系统支持的所有抽象字符的集合.字符是各种文字和符号的总称, ...

  7. mysql乱码utfmb4_MySQL乱码问题以及utf8mb4字符集

    MySQL乱码问题以及utf8mb4字符集 1.乱码 推荐你们看 深刻MySQL字符集设置 ,区分检查client端.server端的编码:最简单暴力的方式,是在全部的环节都显式明确的指定相同的编码, ...

  8. MySQL数据库、数据表和字段字符集查询、修改和配置

    一.设置编码 LINUX  修改vi/etc/my.cnf WINDOWS my.ini 在[client]下添加    default-character-set=utf8 在[mysqld]下添加 ...

  9. mysql启动参数(/etc/my.cnf)详解汇总

    mysql启动参数(/etc/my.cnf)详解汇总 MYSQL–my.cnf配置中文详解 basedir = path 使用给定目录作为根目录(安装目录). character-sets-dir = ...

  10. mac终端下修改MySQL的编码格式以解决中文乱码问题--找不到my-default.cnf及my.cnf

    查看一下support-files文件夹(Finder下"前往文件夹";路径:/usr/local/mysql/support-files) 里面有没有my-default.cnf ...

最新文章

  1. 电子学会青少年编程等级考试Python案例10
  2. stderr和stdout(printf、fprintf、sprintf)(转)
  3. python 参数个数 同名函数_Python——函数的参数
  4. 《统计学习方法》读书笔记——感知机(原理+代码实现)
  5. js排序算法详解-桶排序
  6. vb6 控件未注册问题解决
  7. Netlog中数据库演变过程(转载)
  8. token与refresh_token
  9. 阿里巴巴、腾讯、字节跳动“顺从”互联网监管,提交应用算法详情
  10. 第9节-学会使用cookie-互动练习-“解密加密文章”
  11. oracle的系统字符集,Oracle操作系统和支持-字符集
  12. 微信小程序制作-----日历记事本
  13. SAP EWM TCODE list
  14. hive--解决使用not in之后返回数据为空的问题
  15. POJ1008 玛雅历
  16. 计算机中丢失d3dx941,d3dx9_41.dll(支持64位)
  17. 读论文《A Neural Probabilistic Language Model》
  18. 《手机拍照与视频》那点事
  19. 第一个ASP.net的CRED(创建读取编辑删除)页面
  20. 全景影像多层级瓦片生成

热门文章

  1. 李力刚:职场上如何成功推销自己
  2. 学习制作横版游戏——2
  3. mysql的安全性实验报告_数据库安全性与完整性实验报告
  4. java未来三年的工作计划_个人未来三年工作计划
  5. 写在Aras Innovator技术贴 前面
  6. 空中网创始人杨宁:忽悠就是融资能力
  7. 冉宝的每日一题--8月11日
  8. 冉宝的每日一题--8月6日、8月7日--今天想学会拓扑排序
  9. 计划三年投入十亿资金,统信UOS生态腾飞加速
  10. 我常用的轻量化哈希校验工具,右键菜单栏一键计算文件Hash~