項目開發中,在做Mybatis動態查詢時,遇到了一個問題:MySQL在進行LIKE模糊查詢時,輸入英文可以正常檢索出結果,但是輸入中文后檢索得到的結果為空。
由於是使用GET方式請求,所以為了確保中文不亂碼,在控制台接收到請求參數后,對中文進行了一次編碼。try {
realName = new String(realName.getBytes("GBK"), "UTF-8");
} catch (UnsupportedEncodingException exception) {
logger.error("realName在進行UTF-8編碼時出錯," + exception.toString());
}
Mybatis動態SQL映射,具體的SQL如下:
首先使用模糊查詢檢索英文。啟動項目,輸入英文“test”,按照英文內容檢索得到的結果如下圖:
我們可以看到SQL正常執行,使用“test”總共檢索出2條結果,數據庫中對應字段的內容分別是張三test02和張三test,正常來說,如果我們輸入中文“張”也可以查詢到這兩條數據,下面試試使用模糊查詢檢索中文。啟動項目,輸入中文“張”,檢索得到結果如下圖:
我們可以看到這里檢索出的結果是0條記錄,並且條件的中文內容沒有亂碼,和預想中的並不一樣。復制同樣的SQL語句到SQLyog中執行是可以正常檢索出結果的。
在使用SQLServer時並沒有出現過這樣的問題,這次使用MySQL才出現這種情況,懷疑是在Mybatis配置數據源environment時SQLServer和MySQL配置的內容有差異,仔細對比並上網查閱相關內容后發現,MySQL在進行中文檢索時,需要在jdbcURL后增加參數useUnicode=true&characterEncoding=UTF-8來指定編碼格式。
完整的URL:jdbc:mysql://127.0.0.1:3306/fanyl_web?useUnicode=true&characterEncoding=UTF-8
在修改了MySQL的jdbcURL后,啟動項目,繼續輸入中文“張”,檢索得到結果如下:
總共檢索出3條結果,至此Mybatis使用MySQL進行模糊查詢時輸入中文檢索不到結果的問題就解決了。
另外再附上MySQL的jdbcURL中常見的幾個參數說明:
參數名稱
參數說明
user
數據庫用戶名(用於連接數據庫)
password
數據庫密碼(用於連接數據庫)
autoReconnect(true/false)
當數據庫連接異常中斷時,是否自動重新連接
maxReconnects
autoReconnect設置為true時,重試連接的次數
initialTimeout
autoReconnect設置為true時,兩次重連之間的時間間隔,單位:秒
useUnicode(true/false)
是否使用Unicode字體編碼
characterEncoding
當useUnicode設置為true時,指定字符編碼
relaxAutocommit(true/false)
是否自動提交
connectTimeout
和數據庫服務器建立socket連接時的超時,單位:毫秒。
socketTimeout
socket操作(讀寫)超時,單位:毫秒。