mysql存储emoji
MySQL 5.5.3之前的版本utf8最多只能存储三个字节,不能支持emoji表情,需要用MySQL 5.5.3或者以上的版本才可以,字符集用utf8mb4,见http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-upgrading.html
MySQL Connector必须选择MySQL Connector/J 5.1.13的版本(目前我们用这个)才可以支持字符集utf8mb4
② mysql表是utf8编码为什么有的emoji表情能存储有的不能存
通过上文我们已经知道一种解决办法了,但有一个硬性条件就是你的数据库版本。当你的数据库版本没有达到5.5.3怎么办呢…总结一下,mysql支持存储emoji表情的方法,至少有两种。1.修改数据库编码为utf8mb4,前提是你的mysql数据库版本必须得是5.5.3及以后的2.将带emoji的文本转为base64来进行存储,返回时进行相应解码返回
③ MySQL(2)数据库对象与应用
库建立好之后基本不动,和我们接触最频繁的是表. 建表就是声明字段的过程!
选择合适的类型[速度快 减少硬盘占用]
存储空间,还是存储范围有区别?
答案: 两者本质完全一样 ,只是在一些特殊情况下两者显示有区别(只是在显示的时候补全0的位数不一样)
实验
*zerofill 零填充(本字段同时即自动带有unsigned属性,因为负数不能零填充)
如 数字2在固定宽度4时 零填充 即为0002
M值是一个整数(固定宽度值),只有在字段有零填充zerofill属性时 规定M值才有意义!
M值只是 显示效果 ,不会影响实际数据值!
如M值为1,实际值255,一样会显示255
列可以声明默认值(推荐声明)
因为null无法和别的值比较
null = 0 返回null
null <> 0 返回null
null只能用is或is not比较 null is null当然对的。
例子:
【浮点型】有误差,不稳定!定点数更精确。
实际测试数据
Float(M,D)
M精度(总位数,不包含点) 精度值M 影响 存储的 值的范围.
D标度(小数位) 小数点后有几位(mysql比较特殊,mssql/oracle都不能指定)
testcolumn float(5,2) unsigned; 范围0到999.99
float(5,2)的范围-999.99到999.99
给float(5,2)这样的字段插入值在进位时有一些规矩:暂时没搞清楚,不是简单的四舍五入
插入值688.826实际是688.83 末尾6 进位
插入值688.825实际是688.83 末尾5 进位
插入值688.824实际是688.82 末尾4 舍去
插入值688.005实际是688.00
插入值688.015实际是688.01 末尾5 5前面是1 舍去
插入值688.025实际是688.02 末尾5 5前面是2 舍去
插入值688.035实际是688.03 末尾5 5前面是3 舍去
插入值688.045实际是688.04 末尾5 5前面是4 舍去
一般使用tinyint、char(1)、enum类型。
varchar(M)
M代表宽度 即可容纳的【字符数】 (并不是字节数) varchar占用的字节数与编码有关:
utf-8 一个汉字3字节英文字母1字节
对于utf8mb4号称占用4字节但是并不绝对(在utf8可以覆盖到的范围则仍然占用3字节)
utf8mb4最有优势的应用场景:存储emoji表情
例子:
性能太差,不推荐
MySQL在5.6.4版本之后,TimeStamp和DateTime支持到微妙
一个例子:
以如下这张表为例
show privileges 命令可以查看全部权限
查询时从user->db->table_pirv->columns_pirv依次验证,如果通过则执行查询。
本课程涉及建表SQL
场景1:歌单按时间排序
场景2:统计云音乐创建歌单的用户
场景3-1:统计云音乐创建歌单的用户列表和每人创建歌单的数量。
场景3-2:统计云音乐创建歌单的用户列表和每人创建歌单的数量,并且只显示歌单数量排序大于等于2的用户
SQL进阶语法-like
场景4:查询一个月内创建歌单(从第6行开始显示10条记录)
场景5:对于未录入歌曲的歌单(trackcount = null),输出结果时歌曲数返回0.
连接的作用是用一个SQL语句把多个表中相互关联的数据查出来
场景6:查询收藏“老男孩”歌单的用户列表
子查询:内层查询的结果作为外层的比较条件。一般子查询都可以转换成连接,推荐使用连接。
场景7:查询出没有用户收藏的歌单
场景8:老板想看创建和收藏歌单的所有用户,查询play_list和play_fav两表中所有的userid
实例还是上节中的那些表
场景1:查询每张专辑总的点播次数和每首歌的平均点播次数。
场景2:查询全部歌曲中的最大的播放次数和最小的播放次数。
场景2续:查询播放次数最多的歌曲
count(*) 和 count(1) 基本一样,没有明显的性能差异。
count(*) 和 count(song_name) 差别在于 count(song_name) 会除去song_name is null的情况
场景3:显示每张专辑的歌曲列表
实例:查询一个月内userid为1,3,5的用户创建的歌单
学生表:
用于更正成绩的触发器:
④ 如何将Emoj表情插入mysql5.6数据库 python+mysqldb
1、桌面上右击 计算机,选择“管理”, 选择“服务和应用程序”---“服务”, 在里面找到MySQL56的服务。
2、右击 MySQL服务,查看“属性”:往后拖一下,找到—default-file下图中画框部分,这里指明了MySQL启动的时候要加载的配置文件.
3、 找到该路径下的配置文件,进行修改。
4、 具体修改内容:
文字:
[client]
port=3306
default-character-set=utf8mb4
[mysql]
port=3306
default-character-set=utf8mb4
[mysqld]
port=3306
character-set-client-handshake= FALSE
character-set-server= utf8mb4
collation-server= utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
5、 然后重启MySQL56服务。
6、 在运行里面,找到并打开mysql command line,使用以下命令查看是否生效。
SHOWVARIABLES WHERE Variable_name LIKE 'character/_set/_%' OR Variable_name LIKE'collation%';
看到下面这个画面就说明生效了:
7、以为这样就完了吗?No,即使是这样我们无论是在mysql workbench还是通过python+mysqldb建立的utf8mb4数据库其实还是utf-8的,也正因如此,我们的emoj字符才一直不能插入到数据库中。
即使建立的数据库是utf8mb4的,我们看到这个数据库还是utf8的。
所以我们还需要继续实验,仔细看修改配置文件里面有一句:init_connect='SETNAMES utf8mb4',那我可以拿来用到数据库中。
果然,发现加上“SET NAMES utf8mb4;”这句以后,数据库变成了utf8mb4.:
⑤ 怎么将emoji表情存入mysql
从
mysql
5.5.3
开始,mysql
支持一种
utf8mb4
的字符集,这个字符集能够支持
4
字节的
utf8
编码的字符。
utf8mb4
字符集能够完美地向下兼容
utf8
字符串。在数据存储方面,当一个普通中文字符存入数据库时仍然占用
3
个字节,在存入一个
unified
emoji
表情的时候,它会自动占用
4
个字节。所以在输入输出时都不会存在乱码的问题了。由于
utf8mb4
是
utf8
的超集,从
utf8
升级到
utf8mb4
不会有任何问题,直接升级即可;如果从别的字符集如
gb2312
或者
gbk
转化而来,一定要先备份数据库。然后,修改
mysql
的配置文件
/etc/my.cnf,修改连接默认字符集为
utf8mb4
,然后在连接数据库以后首先执行一句
sql:
set
names
utf8mb4;。
1.
修改my.cnf
或
my.ini
[mysqld]
character-set-server=utf8mb4
[mysql]
default-character-set=utf8mb4
修改后重启mysql
登陆mysql,
show
variables
like
'character%';
可以查看编码是否已经修改成功。
2、修改数据库和数据表为相应的
utf8mb4
格式。
alter
table
table_name
convert
to
character
set
utf8mb4
collate
utf8mb4_bin;
3、在代码中,连接数据库成功后,执行
"set
names
utf8mb4"
⑥ input保存emoji发送java
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
打开APP
制造bug的键盘钢琴师
关注
Java中解决app传的emoji表情的多种方式 原创
2019-01-26 17:58:13
2点赞
制造bug的键盘钢琴师
码龄5年
关注
今天项目遇到的一个问题,APP订单评论提交emoji表情的话会报错,由于需要实现emoji表情评论的功能,根据自己实现的方式以及查询的实现方式,现总结为一下几种
mysql的utf8编码的一个字符最多3个字节,但是一个emoji表情为4个字节,所以utf8不支持存储emoji表情。
实现方式一
对APP传入后端的数据包括字符串和emoji表情,把emoji表情和String都进行Base64转换,存储在数据库中,取的时候再转换回来即可解决上述问题,这是最快也是最简单的解决方法。
1、最适合应用场景:
h5或者android开发中通常会遇到一种场景,当用手机输入法输入Emoji表情符的时候,由于数据库不支持,保存时这些表情符号就会被过滤掉以至于无法显示,android和h5开发中可以使用Base64算法解决这个问题。
2、使用工具:
使用Apache commons codec 类Base64
3、引入jar包:
加入jar包依赖(如果是maven项目就直接在pom文件中加入下边内容,若不是就加入对应jar包)
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
</dependency>
4、加密解密实现:
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.UnsupportedEncodingException;
/**
* 将String类型的字符串进行base64编码与解码,使用utf-8
*/
public
class Base64Util {
private
static
final Logger logger = LoggerFactory.getLogger(Base64Util.class);
/**
* 对给定的字符串进行base64加密
*/
public static String encodeData(String inputData) {
try {
if (
null == inputData) {
return
null;
}
return
new String(Base64.encodeBase64(inputData.getBytes(
"utf-8")),
"utf-8");
}
catch (UnsupportedEncodingException e) {
logger.error(inputData, e);
}
return
null;
}
/**
* 对给定的字符串进行base64解密
*/
public static String decodeData(String inputData) {
try {
if (
null == inputData) {
return
null;
}
return
new String(Base64.decodeBase64(inputData.getBytes(
"utf-8")),
"utf-8");
}
catch (UnsupportedEncodingException e) {
logger.error(inputData, e);
}
return
null;
}
}
1
1
实现方式二
mysql 字符集utf8的超集utf8mb4一个字符最多能有4字节,所以能支持emoji表情的存储。只要修改mysql数据库的编码格式变为utf8mb4即可
具体方法可参考连接
这种方式后台不用再做额外的操作,直接正常存储即可,但是修改数据库会比较麻烦
实现方式三
通过emoji-Java解决数据库不能存储4字节表情符号