2016-12-08 70 views
2

我在MySql中保存unicode字符時遇到問題。字符在MySQL中顯示爲問號

最初我的數據庫字符集設置爲latin1,Unicode字符串保存爲引號。之後做一些研究,我添加以下行my.cnf

[mysqld] 
character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 

和執行查詢:

ALTER DATABASE <my_database> CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci 

重啓MySQL後,我得到一個錯誤:

"org.springframework.jdbc.UncategorizedSQLException: Hibernate operation: Could not execute JDBC batch update; uncategorized SQLException for SQL ... Incorrect string value: '\xD0\xBA\xD1\x81\xD0\xB5...' for column 'first_name' at row 1"

查詢mysql> show variables like 'char%';返回結果:

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 create database <my_database>給出:

| Database | Create Database              | 
+-----------+-----------------------------------------------------------------------+ 
| my_database | CREATE DATABASE `my_database` /*!40100 DEFAULT CHARACTER SET utf8mb4 */ 

我知道這個問題得到的回答很多時間,但我什麼都試過了我在谷歌發現,仍然無法修復它。任何幫助表示讚賞!

UPDATE

查詢SHOW CREATE TABLE後,我看到,該表的默認字符集是latin1的。

我改變了表格ALTER TABLE my_table CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

後,每列有CHARACTER SET設置爲latin1,而在查詢結果的最後默認字符集是utf8mb4

ALTER TABLE my_table MODIFY my_column VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL改變柱後,我得到了保存該值時擺脫錯誤的,但它回到用問號保存字符串。仍然沒有發現問題

+0

你是否改變了你的Java應用程序中的*連接編碼*(或任何產生該錯誤)......! – deceze

+0

@deceze我在jdbc:mysql URL中有「useUnicode = true&characterEncoding = utf-8」,這是你的意思嗎? – yinjia

+1

請提供'SHOW CREATE TABLE'。 _column_必須是utf8mb4。 –

回答

3

因此2天后,我能夠在評論和其他帖子的幫助下找到它。

使用Unicode的問題是在2層: 1)它是如何保存在MySQL 2)如何Freemarker的是顯示值

這些都是我做的步驟,來解決這個問題:

STEP1:添加以下行my.cnf文件:

character-set-client-handshake = FALSE 
character-set-server = utf8mb4 
collation-server = utf8mb4_unicode_ci 

STEP2:運行查詢

ALTER TABLE my_table MODIFY my_column VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL

爲每個需要接受UTF-8柱。修復了MySql編碼。注意:改變整個數據庫或表似乎沒有工作。

步驟3:以下屬性添加到ContentNegotiatingViewResolver豆:

<beanclass="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
     <property name="contentType" value="text/html;charset=UTF-8"/> 
    </bean> 

問題解決了。

+0

非常感謝。只是做第二步爲我做了訣竅。 – user1875631

0

打開my.conf文件,並添加:

[mysql] 
default-character-set=utf8 

到文件的末尾。

請記住重新啓動您的sqld服務以反映更改。