問(wèn)題背景:
數(shù)據(jù)庫(kù)遷移,使用 mysqldump 導(dǎo)出的文件,創(chuàng)建新的數(shù)據(jù)庫(kù)。
原庫(kù):MySQL 5.7.17
新庫(kù):MySQL 5.7.18
問(wèn)題:使用新的庫(kù),測(cè)試發(fā)現(xiàn)網(wǎng)頁(yè)的某個(gè)標(biāo)簽下沒(méi)有查出內(nèi)容。
嘗試:
1,靜態(tài)復(fù)制數(shù)據(jù)庫(kù)文件
2,升級(jí) MySQL 到同一個(gè)小版本
問(wèn)題仍然存在。
發(fā)現(xiàn)問(wèn)題的線索:
再三確認(rèn)排除代碼的不一致之后,直接使用 java 的API接口測(cè)試。
分別連接老庫(kù)和新庫(kù),發(fā)現(xiàn)連接老庫(kù)可以返回內(nèi)容,連接新庫(kù)則不可以。
分別在老庫(kù)和新庫(kù)在線開(kāi)啟 MySQL 查詢?nèi)罩?,獲取查詢語(yǔ)句:
SET GLOBAL general_log=1;
開(kāi)啟之后,獲得了查詢語(yǔ)句,發(fā)現(xiàn)問(wèn)題點(diǎn),老庫(kù)上部分SQL語(yǔ)句如下:
and dd_notices.typeName='??'
新庫(kù)上部分SQL語(yǔ)句如下:
and dd_notices.typeName='通知'
這里是中文的查詢條件,猜測(cè)導(dǎo)致此問(wèn)題的大概是字符集問(wèn)題。
網(wǎng)查了解到如下信息:
mysql 數(shù)據(jù)庫(kù)內(nèi)容可以有多種編碼。
首先要知道數(shù)據(jù)庫(kù)的編碼格式然后在db連接建立的url當(dāng)中增加條件
useUnicode是否使用Unicode字符集,如果參數(shù)characterEncoding設(shè)置為gb2312或gbk,本參數(shù)值必須設(shè)置為true缺省值為false
characterEncoding當(dāng)useUnicode設(shè)置為true時(shí),指定字符編碼。比如可設(shè)置為gb2312或gbk
例如:
jdbc:mysql://127.0.0.1:3306/bookDB?useUnicode=true&characterEncoding=utf-8
...
當(dāng)參數(shù)2號(hào)為中文字符的時(shí)候如果db連接url不增加字符集則查不出任何行,英文任何字符集都支持
參考:http://blog.sina.com.cn/s/blog_5ff02a9f0100y7ot.html
那估計(jì)問(wèn)題處在 jdbc 連接參數(shù)上面,在參數(shù)里面添加 "&characterEncoding=UTF-8":
jdbc.url=jdbc:mysql://localhost:3306/db1?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true
重啟 tomcat 之后,可以返回結(jié)果了。
證明問(wèn)題是在這里。
留下的問(wèn)題:之前沒(méi)有加這個(gè)參數(shù),連接老庫(kù)是沒(méi)有字符集的問(wèn)題呢? 猜測(cè)跟 MySQL 這邊的默認(rèn)設(shè)置有關(guān)系。