在安裝MySQL的時候,我遇到學生沒有按照規矩設置,致使JDBC鏈接數據庫後,對數據庫的操做出現亂碼問題,那個時候我就匆忙的給學生添加了一下鏈接設置,可是學生並無太懂,因此在這裏我簡單介紹一下.java
出現亂碼的問題無外乎就是編碼設置的不統一致使的!mysql
jdbc:mysql://localhost:3306/數據庫名?useUnicode=true&characterEncoding=UTF-8
複製代碼
做用說明: 指定字符的編碼/解碼的格式sql
mysql數據庫用的是GBK編碼,而項目數據庫用的是utf-8編碼.這時候若是添加了useUnicode=true&characterEncoding=UTF-8
,那麼做用有以下兩個方面:數據庫
存儲數據時緩存
數據庫在存放項目數據的時候會先用UTF-8格式將數據解碼成字節碼,而後再將解碼後的字節碼從新使用GBK編碼存放到數據庫中。服務器
獲取數據時socket
在從數據庫中取數據的時候,數據庫會先將數據庫中的數據按GBK格式解碼成字節碼,而後再將解碼後的字節碼從新按UTF-8格式編碼數據,最後再將數據返回給客戶端。編碼
注意: 在xml配置文件中配置數據庫utl時,要使用&的轉義字符也就是
&
spa
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
爲加強可讀性指定別名,有相同名字的時候用別名區分,須要被聯查屢次的時候用別名區分.
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()格式會比較浪費空間,如無必要,不建議使用。