JDBC亂碼引起的"血案"

JDBC的設置說明

在安裝MySQL的時候,我遇到學生沒有按照規矩設置,致使JDBC鏈接數據庫後,對數據庫的操做出現亂碼問題,那個時候我就匆忙的給學生添加了一下鏈接設置,可是學生並無太懂,因此在這裏我簡單介紹一下.java

出現亂碼的問題無外乎就是編碼設置的不統一致使的!mysql

  • 多是代碼的編碼與數據庫的編碼不一樣
    • 注意之後所有使用UTF-8格式就好
jdbc:mysql://localhost:3306/數據庫名?useUnicode=true&characterEncoding=UTF-8
複製代碼

做用說明: 指定字符的編碼/解碼的格式sql

情景描述

mysql數據庫用的是GBK編碼,而項目數據庫用的是utf-8編碼.這時候若是添加了useUnicode=true&characterEncoding=UTF-8,那麼做用有以下兩個方面:數據庫

  1. 存儲數據時緩存

    數據庫在存放項目數據的時候會先用UTF-8格式將數據解碼成字節碼,而後再將解碼後的字節碼從新使用GBK編碼存放到數據庫中。服務器

  2. 獲取數據時socket

    在從數據庫中取數據的時候,數據庫會先將數據庫中的數據按GBK格式解碼成字節碼,而後再將解碼後的字節碼從新按UTF-8格式編碼數據,最後再將數據返回給客戶端。編碼

注意: 在xml配置文件中配置數據庫utl時,要使用&的轉義字符也就是&spa

JDBC屬性說明

jdbc:mysql://[host][,failoverhost...][:port]/[database] »[?propertyName1][=propertyValue1][&propertyName2][=propertyValue2]
複製代碼
參數名稱 默認值 最低版本要求 參數描述
user 全部版本 數據庫用戶名(用於鏈接數據庫)
password 全部版本 用戶密碼(用於鏈接數據庫)
useUnicode false 1.1g 是否使用Unicode字符集
characterEncoding false 1.1g 指定字符編碼
autoReconnect false 1.1 當數據庫鏈接異常中斷時,是否自動從新鏈接?
autoReconnectForPools false 3.1.3 是否使用針對數據庫鏈接池的重連策略
failOverReadOnly true 3.0.12 自動重連成功後,鏈接是否設置爲只讀?
maxReconnects 3 1.1 autoReconnect設置爲true時,重試鏈接的次數
initialTimeout 2 1.1 autoReconnect設置爲true時,
兩次重連之間的時間間隔,單位:秒
connectTimeout 0 3.0.1 和數據庫服務器創建socket鏈接時的超時,單位:毫秒。 0表示永不超時,適用於JDK 1.4及更高版本
socketTimeout 0 3.0.1 socket操做(讀寫)超時,單位:毫秒。 0表示永不超時

對應中文環境,一般MySQL鏈接URL能夠設置爲:code

jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=TRUE&failOverReadOnly=false
複製代碼

autoReconnect=true : 若是你已經升級好了mysql-connector,其中的characterEncoding=utf8能夠被自動被識別爲utf8mb4(固然也兼容原來的utf8),而autoReconnect配置我強烈建議配上,我以前就是忽略了這個屬性,致使由於緩存緣故,沒有讀取到DB最新配置,致使一直沒法使用utf8mb4字符集,多麼痛的領悟!!

在之後的MyBatis中處理多條SQL語句的時候,由於MySQL驅動沒有開啓批量執行SQL的開關,咱們須要再MySQL鏈接的URL時候,爲其加上allowMultiQueries參數,設置爲true

jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
複製代碼

在使用數據庫鏈接池的時候,最好設置以下兩個參數

autoReconnect=true&failOverReadOnly=false

MySQL SQL語句別名不生效問題:useOldAliasMetadataBehavior

爲加強可讀性指定別名,有相同名字的時候用別名區分,須要被聯查屢次的時候用別名區分.

jdbc:mysql://localhost/openemm?useUnicode=yes&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true
其中:
+ jdbc: mysql://localhost/openemm?這個表明數據庫連接地址,
+ useUnicode=yes&characterEncoding=UTF-8這個表明容許用戶本身設定數據庫編碼,並且設置成UTF-8
+ useOldAliasMetadataBehavior=true這個表明數據庫裏面容許有別名
複製代碼

鏈接後再數據庫中查詢不到數據

明明數據庫內有符合條件的數據,可是就是沒法查詢到?多是犯了以一個低級的錯誤。

數據庫內儘可能不要使用nchar()這種格式,由於固定了位數,當數據的位數不夠的時候就會使用空字符來佔位。如:

name nchar(10) -->施維新

使用String輸出時,會看到施維新□□□□□□□
複製代碼

同時nchar()格式會比較浪費空間,如無必要,不建議使用。

附錄

相關文章
相關標籤/搜索