MySQL utf8與utf8mb4

報錯信息:

java.lang.RuntimeException: java.sql.SQLException: 
Incorrect string value: '\\xF0\\x9F\\x9A\\xB9\\xE4\\xBC...' for column 'xxx' ...

引起的原因:
在varchar類型的字段里面插入的text包含emoj表情。
MySQL 5.5.3 版本以下玖绿,CHARACTER SET 為 utf8 的字段最長只有3個字節(jié)纵菌。
查看MySQL版本可用以下命令:

mysql> status;
--------------
mysql  Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using  EditLine wrapper

Connection id:      5
Current database:   
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server version:     5.7.17-0ubuntu0.16.04.1 (Ubuntu)
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8mb4
Conn.  characterset:    utf8mb4
UNIX socket:        /var/run/mysqld/mysqld.sock
Uptime:         1 hour 28 min 58 sec

Threads: 1  Questions: 28  Slow queries: 0  Opens: 116  Flush tables: 1  Open tables: 29  Queries per second avg: 0.005
--------------

查看相關(guān)字符集設(shè)置信息(下面是我修改后的,修改前utf8mb4處都為utf8):

mysql>  show variables like 'character_set_%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

查看所有字符集信息:

mysql> show character set;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
+----------+---------------------------------+---------------------+--------+

由上表可見,utf8最長3個字節(jié)带射。

在5.5.3版本以后,增加了 [utf8mb4] (https://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html) 字符集循狰。
這是官方原文:

The character set named utf8 uses a maximum of three bytes per character and contains only BMP characters. As of MySQL 5.5.3, the utf8mb4 character set uses a maximum of four bytes per character supports supplementary characters:

  • For a BMP character, utf8 and utf8mb4 have identical storage characteristics: same code values, same encoding, same length.
  • For a supplementary character, utf8 cannot store the character at all, whereas utf8mb4 requires four bytes to store it. Because utf8 cannot store the character at all, you have no supplementary characters in utf8 columns and need not worry about converting characters or losing data when upgrading utf8 data from older versions of MySQL.

因此窟社,只需要將字符集由utf8修改為utf8mb4即可支持4字節(jié)的BPM等數(shù)據(jù)。

如何修改:
修改MySQL配置文件绪钥,修改mysql的客戶端默認連接字符集灿里,服務端以及數(shù)據(jù)庫的默認字符集:

sudo vim /etc/mysql/my.cnf

在末尾或者已有的中括號里的塊中加上如下配置:

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'

重啟MySQL服務:

sudo service mysql restart

重啟服務后,通過以下SQL可以查看結(jié)果:

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name            | Value              |
+--------------------------+--------------------+
| character_set_client     | utf8mb4            |
| character_set_connection | utf8mb4            |
| character_set_database   | utf8mb4            |
| character_set_filesystem | binary             |
| character_set_results    | utf8mb4            |
| character_set_server     | utf8mb4            |
| character_set_system     | utf8               |
| collation_connection     | utf8mb4_unicode_ci |
| collation_database       | utf8mb4_unicode_ci |
| collation_server         | utf8mb4_unicode_ci |
+--------------------------+--------------------+

MySQL方面修改好后程腹,需要修改已有的數(shù)據(jù)庫或者表或者字段:
修改表的字符集:

ALTER TABLE tablename charset=utf8mb4;

修改表字段:

ALTER TABLE tablename MODIFY COLUMN columnname VARCHAR(255) CHARACTER SET utf8mb4;

修改表的字符集和修改字段可以用一條SQL完成匣吊。

如果使用的java連接MySQL,需要修改原有的連接設(shè)置:
原jdbcUrl:jdbc:mysql:///dbname?useUnicode=true&characterEncoding=UTF-8
需要去掉編碼參數(shù):
jdbcUrl:jdbc:mysql:///dbname

** 此處不要想當然的將參數(shù)useUnicode=true&characterEncoding=UTF-8修改為useUnicode=true&characterEncoding=utf8mb4
寸潦,否則會報出以下錯誤:

Could not get JDBC Connection; nested exception is com.MySQL.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 
Unknown character set: 'utf8mb4'

我們在MySQL的配置文件里已經(jīng)配置了[client]的默認訪問字符集了缀去,所以,此處將參數(shù)去掉即可甸祭。

吃水不忘打井人:
http://blog.csdn.net/secretx/article/details/21253559
http://stackoverflow.com/questions/7814293/how-to-insert-utf-8-mb4-characteremoji-in-ios5-in-mysql

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缕碎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子池户,更是在濱河造成了極大的恐慌咏雌,老刑警劉巖凡怎,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赊抖,居然都是意外死亡统倒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門氛雪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來房匆,“玉大人,你說我怎么就攤上這事报亩≡『瑁” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵弦追,是天一觀的道長岳链。 經(jīng)常有香客問我,道長劲件,這世上最難降的妖魔是什么掸哑? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮零远,結(jié)果婚禮上苗分,老公的妹妹穿的比我還像新娘。我一直安慰自己牵辣,他們只是感情好俭嘁,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著服猪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪拐云。 梳的紋絲不亂的頭發(fā)上罢猪,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音叉瘩,去河邊找鬼膳帕。 笑死,一個胖子當著我的面吹牛薇缅,可吹牛的內(nèi)容都是我干的危彩。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼泳桦,長吁一口氣:“原來是場噩夢啊……” “哼汤徽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灸撰,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤谒府,失蹤者是張志新(化名)和其女友劉穎拼坎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體完疫,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡泰鸡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了壳鹤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盛龄。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芳誓,靈堂內(nèi)的尸體忽然破棺而出余舶,到底是詐尸還是另有隱情,我是刑警寧澤兆沙,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布欧芽,位于F島的核電站,受9級特大地震影響葛圃,放射性物質(zhì)發(fā)生泄漏千扔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一库正、第九天 我趴在偏房一處隱蔽的房頂上張望曲楚。 院中可真熱鬧,春花似錦褥符、人聲如沸龙誊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽趟大。三九已至,卻和暖如春铣焊,著一層夾襖步出監(jiān)牢的瞬間逊朽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工曲伊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留叽讳,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓坟募,卻偏偏與公主長得像岛蚤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子懈糯,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容

  • 1涤妒、問題:mysql 遇到某些中文插入異常最近有同學反饋了這樣一個問題: 上述語句在腳本中 load 入庫的時候會...
    kanasu閱讀 2,824評論 1 5
  • 前段時間公司內(nèi)部博客上凱哥分享了一篇關(guān)于mysql字符集編碼的文章,之前我對mysql字符集一塊基本沒有深究過,看...
    __七把刀__閱讀 6,423評論 14 18
  • 轉(zhuǎn) 問題描述: 如果UTF8字符集且是Java服務器的話,當存儲含有emoji表情時赚哗,會拋出類似如下異常: jav...
    天上掉陷阱閱讀 758評論 0 3
  • MySQL數(shù)據(jù)庫對象與應用 2.1-MySQL數(shù)據(jù)類型 庫建立好之后基本不動,和我們接觸最頻繁的是表. 建表就是聲...
    極客圈閱讀 2,136評論 0 8
  • 新年計劃届腐。 2016回顧好多人都在朋友圈貼書單铁坎,看得人好唏噓。自己這一年書讀得沒幾本犁苏,知乎倒是刷了不少硬萍,看知乎給每...
    猴子已死閱讀 309評論 1 1