MySQL設定utf8mb4編碼
有一個專案需要儲存ios的表情(emoji表情)
這種表情雖然是utf8編碼,但是一個字元需要佔用4個位元組,而MySQL utf8編碼只能存放3位元組的字元。
在MySQL 5.6中,可以設定編碼為utf8mb4,這個字符集是utf8的超集。
實驗環境
MySQL 5.6.14
JDBC 5.1.31
測試表 create table test( content varchar(50) )engine=innodb,charset=utf8mb4;
測試程式:
測試連結:
兩次編碼後的ios表情:
%25F0%259F%2598%2584
兩次編碼後的中文:
%25E4%25B8%25AD%25E6%2596%2587
關於兩次編碼參見:
http://blog.itpub.net/29254281/viewspace-775925/
首先,修改mysql的配置檔案
character_set_server=utf8mb4
然後重啟資料庫和中介軟體.
點選兩個測試的連結,檢視資料庫,發現資料成功插入。
這個過程理論上是不需要重啟資料庫的。
但是實際測試中發現,如果不重啟資料庫,則插入會報錯。
如果運氣好,直接修改character_set_server引數,重啟資料庫,一切正常,就OK了。
運氣不好(比如我),就很悲劇了。
我在生產庫上修改了配置,並且重啟了資料庫。
居然發現ios的表情插入資料庫都是亂碼(全是問號 ????)
更悲劇的是,過了幾分鐘突然發現線上新插入的資料都是亂碼(也都是問號)。
幸虧發現的早,還原了資料庫的配置,否則執行幾天之後發現,估計就得收拾小包袱走人了。
後來排查到這個問題是JDBC驅動造成的,線上JDBC驅動的版本是mysql-connector-java-5.1.6-bin
如果MySQL伺服器設定為utf8mb4 高版本的JDBC驅動沒有關係,但是低版本的驅動插入之後,就是下面這個樣子。
所有輸入的非英文字元都是亂碼了。
因為JDBC驅動並不支援utf8mb4字符集,所以不能設定JDBC URL的characterEncoding
不過還有三種方式可以設定字符集
1.不顯式設定字符集,繼承伺服器的配置
2.在執行SQL之前,執行set names 的查詢 (Query方式)
3.設定MySQL init_connect引數
經過測試各種因素的結果如下所示:
總結:
1.修改了character_set_server引數,需要重啟資料庫
2.使用高版本的JDBC
參考:
http://blog.csdn.net/ichocolatekapa/article/details/26671669
http://mckobe23.blog.51cto.com/826570/1067388
這種表情雖然是utf8編碼,但是一個字元需要佔用4個位元組,而MySQL utf8編碼只能存放3位元組的字元。
在MySQL 5.6中,可以設定編碼為utf8mb4,這個字符集是utf8的超集。
實驗環境
MySQL 5.6.14
JDBC 5.1.31
測試表 create table test( content varchar(50) )engine=innodb,charset=utf8mb4;
測試程式:
-
import java.io.IOException;
-
import java.net.URLDecoder;
-
import java.net.URLEncoder;
-
import java.sql.Connection;
-
import java.sql.DriverManager;
-
import java.sql.PreparedStatement;
-
-
import javax.servlet.ServletException;
-
import javax.servlet.annotation.WebServlet;
-
import javax.servlet.http.HttpServlet;
-
import javax.servlet.http.HttpServletRequest;
-
import javax.servlet.http.HttpServletResponse;
-
-
/**
-
* Servlet implementation class CharsetTest
-
*/
-
@WebServlet("/CharsetTest")
-
public class CharsetTest extends HttpServlet {
-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
String str = request.getParameter("content");
-
str = URLDecoder.decode(str, "utf8");
-
System.out.println(URLEncoder.encode(str, "utf8"));
-
-
try {
-
save(str);
-
} catch (Exception e) {
-
e.printStackTrace();
-
}
-
-
}
-
-
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
-
doGet(request, response);
-
}
-
-
private static void save(String content) throws Exception {
-
/**
-
* create table test( content varchar(50) )engine=innodb,charset=utf8mb4
-
*/
-
Class.forName("com.mysql.jdbc.Driver");
-
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/xx", "xx", "xx");
-
-
connection.setAutoCommit(true);
-
-
//透過查詢執行設定字符集的命令
-
//connection.prepareStatement("set names utf8mb4").executeQuery();
-
-
PreparedStatement cmd = connection.prepareStatement("insert into test values(?)");
-
cmd.setString(1, content);
-
cmd.executeUpdate();
-
-
cmd.close();
-
connection.close();
-
}
- }
兩次編碼後的ios表情:
%25F0%259F%2598%2584
兩次編碼後的中文:
%25E4%25B8%25AD%25E6%2596%2587
關於兩次編碼參見:
http://blog.itpub.net/29254281/viewspace-775925/
首先,修改mysql的配置檔案
character_set_server=utf8mb4
然後重啟資料庫和中介軟體.
點選兩個測試的連結,檢視資料庫,發現資料成功插入。
這個過程理論上是不需要重啟資料庫的。
但是實際測試中發現,如果不重啟資料庫,則插入會報錯。
如果運氣好,直接修改character_set_server引數,重啟資料庫,一切正常,就OK了。
運氣不好(比如我),就很悲劇了。
我在生產庫上修改了配置,並且重啟了資料庫。
居然發現ios的表情插入資料庫都是亂碼(全是問號 ????)
更悲劇的是,過了幾分鐘突然發現線上新插入的資料都是亂碼(也都是問號)。
幸虧發現的早,還原了資料庫的配置,否則執行幾天之後發現,估計就得收拾小包袱走人了。
後來排查到這個問題是JDBC驅動造成的,線上JDBC驅動的版本是mysql-connector-java-5.1.6-bin
如果MySQL伺服器設定為utf8mb4 高版本的JDBC驅動沒有關係,但是低版本的驅動插入之後,就是下面這個樣子。
所有輸入的非英文字元都是亂碼了。
因為JDBC驅動並不支援utf8mb4字符集,所以不能設定JDBC URL的characterEncoding
不過還有三種方式可以設定字符集
1.不顯式設定字符集,繼承伺服器的配置
2.在執行SQL之前,執行set names 的查詢 (Query方式)
3.設定MySQL init_connect引數
經過測試各種因素的結果如下所示:
|
JDBC版本
|
普通中文
|
蘋果表情
|
伺服器utf8編碼
|
5.1.6
|
正常
|
插入報錯
|
|
5.1.6 Query
|
正常
|
正常
|
|
5.1.6 init_connect
|
正常
|
插入報錯
|
|
5.1.31
|
正常
|
插入報錯
|
|
5.1.31 Query
|
正常
|
正常
|
|
5.1.31 init_connect
|
正常
|
插入報錯
|
伺服器utf8mb4編碼
|
5.1.6
|
亂碼
|
亂碼
|
|
5.1.6 Query
|
亂碼
|
亂碼
|
|
5.1.6 init_connect
|
亂碼
|
亂碼
|
|
5.1.31
|
正常
|
正常
|
|
5.1.31 Query
|
正常
|
正常
|
|
5.1.31 init_connect
|
正常
|
正常
|
1.修改了character_set_server引數,需要重啟資料庫
2.使用高版本的JDBC
參考:
http://blog.csdn.net/ichocolatekapa/article/details/26671669
http://mckobe23.blog.51cto.com/826570/1067388
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-1270015/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JPA設定MySQL編碼MySql
- MySQL資料庫UTF8mb4設定MySql資料庫
- MySQL字元編碼設定方法MySql字元
- mysql列設定了utf8mb4還是報錯MySql
- Mysql支援emoji 表情符號 升級編碼為UTF8MB4MySql符號
- 阿里雲RDS for MySQL使用utf8mb4編碼儲存Emoji表情阿里MySql
- Centos-Mysql建立資料庫-編碼設定CentOSMySql資料庫
- linux上mysql編碼 utf-8設定LinuxMySql
- Mysql設定字元編碼及varchar寬度問題MySql字元
- 編碼設定應注意
- Tomcat 設定編碼Tomcat
- Mysql編碼, Mysql編碼流程, Mysql編碼順序, Mysql編碼原理, Mysql編碼修改依據MySql
- java編譯、編碼、語言設定Java編譯
- mysql如何設定密碼MySql密碼
- MyEclipse設定文字編碼Eclipse
- Ubuntu 下設定中文編碼Ubuntu
- spring字元編碼設定Spring字元
- MyEclipse設定編碼方式Eclipse
- python mysql utf8mb4PythonMySql
- mysql5.7.22設定中文編碼-解決亂碼問題LinuxMySqlLinux
- JSP中的編碼設定JS
- Python 設定系統預設編碼Python
- 小型機設定WebSphere的預設編碼Web
- IDEA如何設定編碼格式,字元編碼,全域性編碼和專案編碼格式Idea字元
- eclipse設定jsp字元編碼EclipseJS字元
- Eclipse中設定編碼的方式Eclipse
- Python設定編碼和PYTHONPATHPython
- mysql第一次設定mysql密碼MySql密碼
- Ubuntu MySQL5.7設定root密碼UbuntuMySql密碼
- php匯入時設定不同的編碼PHP
- Windows CMD永久設定UTF-8編碼Windows
- 【程式設計素質】Java編碼約定程式設計Java
- 設定Tomcat的UTF-8編碼Tomcat
- Vim中輸入法與編碼設定
- Java設定JSON字串引數編碼JavaJSON字串
- mysql 修改字符集為utf8mb4MySql
- mysql編碼修改MySql
- 網頁字元編碼、語言程式碼設定與SEO網頁字元