移动设备 表情符号的数据库存储 与 utf8 与utf8mb4 字符集

我们的一些业务系统最近出现了一种情况,尤其是新版的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=binarycharacter-set-server=utf8mb4
collation-server = utf8mb4_unicode_ciinit_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

[]

 
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 
时间: 2024-10-21 20:35:24

移动设备 表情符号的数据库存储 与 utf8 与utf8mb4 字符集的相关文章

MySQL utf8mb4 字符集:支持 emoji 表情符号

㈠ 序言 为了应对无线互联网的机遇和挑战.避免 emoji 表情符号带来的问题. 涉及无线相关的 MySQL 数据库建议都提前采用 utf8mb4 字符集 这必须要作为移动互联网行业的一个技术选型的要点 ㈡ 限制 需要 >= MySQL 5.5.3版本.从库也必须是5.5的了.低版本不支持这个字符集.复制报错 ㈢ 简要步骤 以下是一个未升级到 5.5.3 的配置步骤: ① 备份数据库 ② 升级 MySQL Server 到 v5.5.3+ ③ 修改 database.table和column字符

Mysql运维管理-MySQL数据库存储引擎知识19

1.MySQL 引擎概述 1.1 什么是存储引擎 我们在录制一个视频文件的时候,可以转换成不同的格式如mp4,avi,wmv等,而且在电脑的磁盘上也会存在于不同类型的文件系统windows里常见的ntfs,fat32,存在于linux操作系统里常见的ext3,ext4,xfs.但是跟我们呈现的内容都是一样的,直观的区别是占用系统空间的大小与清晰程度不一样.那么数据库存储引擎也有很多种存储方式.无论用什么存储引擎来存储,用户看到的数据都是一样的.不同的引擎存储,引擎功能,占用的空间的大小,读取性能

关于在Oracle 数据库存储m³(立方米)

--------------注意:如下操作是在RHEL的VNC中执行的,并不是在secureCRT中执行的.------------ --------------原因:若是在secureCRT执行,m3会显示成:m鲁,见如下的截图,是啥原因我还没研究-- 如下是实验的过程: [[email protected] ~]$ export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 [[email protected] ~]$ sqlplus scott/aaaaaa SQL

使用嵌入式关系型SQLite数据库存储数据

除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库—SQLite, 1.SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n).char(n).decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型. 2.SQLit

SQLite数据库存储

SQLite数据库存储 应用运行需要保存一系列有一定结构的数据, 比如说公司员工信息 文件类型: .db 数据保存的路径: /data/data/projectPackage/databases/xxx.db 默认情况下其它应用不能访问, 当前应用可以通过ContentProvider提供其它应用操作 应用卸载时会删除此数据 SQLite (http://www.sqlite.org/),是一款轻型的关系型数据库服务器, 移动设备的数据库存储都使用SQLite, 它的特点: 安装文件小: 最小只

Exchange Server 运维管理02:邮箱数据库存储原理

重申一下,出此系列文章的目的是为了加强运维管理的能力,也就是说不是部署或者是常规配置,这就需要掌握一些基本的理论知识.如果有朋友需要了解Exchange的部署或者是基本操作,可以参考其他的资源,也可以看我之前的Exchange系列文章. 本文将了解一下Exchage 2010数据库文件的存储原理,可能Exchange部署配置完成后,客户很少去关心底层数据库文件的存储格式,只要DAG副本能正常复制,用户邮箱正常使用就可以了,当然,这是理想状态,但万一数据库发生故障需要对数据库进行修复或者是还原时候

AXIS2+Myeclipse实现WebService数据库存储简单实例

AXIS2+Myeclipse实现WebService数据库存储简单实例 接了个简单的毕业设计.需要WebService实现前台显示后台数据库存储,本人菜鸟,想了下,决定服务端存放有数据库连接的方法,客户端调用服务端提供的方法,实现与数据库的连接. 一.准备工作: 1.下载AXIS2框架 这里使用的版本是axis2-1.7.2,下载地址:http://axis.apache.org/axis2/java/core/download.cgi官网. (1)Binary distribution ax

MYSQL,数据库存储引擎!

本人安装mysql版本为:mysql  Ver 14.14 Distrib 5.7.18, for Win64 (x86_64),查看mysql的版本号方式:cmd-->mysql --version  将会显示出mysql的版本 1.什么是数据库存储引擎? 存储引擎是mysql数据库管理系统的一个重要特征,在具体开发时,为了提高mysql的数据库管理系统的使用效率和灵活性,可以根据具体的实际需要来选择不同的数据库引擎,因为存储引擎指定了表的类型,即如何存储和索引数据,是否支持事务等,同时存储引

不用json文件不用数据库存储实现三级联动

碰到一个好困惑的问题,怎么用简单易懂的方法实现三级联动呢??!!编写json文件?格式不太容易写的json文件,还有迷人的遍历..使用数据库存储数据?来回增删改查真实麻烦....琢磨了好几天,原来只需要简单的jquery语法就可以实现了,顿时令人头晕的问题解决了,真好! 下面是我写的一个小示例: (1)首先是一点小说明: 首先要引入一个jquery.js文件,使用到的几个基本方法参考帮助文档便可理解什么意思: 其次要应该知道:一个学院下面有多个不同的专业,一个专业下面有多个不同的班级,所以应该先