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位元組表情符號