1. 程式人生 > >MySql jdbc URL 引數及編碼說明

MySql jdbc URL 引數及編碼說明

mysql JDBC URL格式如下:
jdbc:mysql://[host:port]/[database][?引數名1][=引數值1][&引數名2][=引數值2]...

現只列舉幾個重要的引數,如下表所示:

引數名稱 引數說明 預設值 最低版本要求
user 資料庫使用者名稱(用於連線資料庫) 所有版本
password 使用者密碼(用於連線資料庫) 所有版本
useUnicode 是否使用Unicode字符集,如果引數characterEncoding設定為gb2312或gbk,本引數值必須設定為true false 1.1g
characterEncoding 當useUnicode設定為true時,指定字元編碼。比如可設定為gb2312或gbk false 1.1g
autoReconnect 當資料庫連線異常中斷時,是否自動重新連線? false 1.1
autoReconnectForPools 是否使用針對資料庫連線池的重連策略 false 3.1.3
failOverReadOnly 自動重連成功後,連線是否設定為只讀? true 3.0.12
maxReconnects autoReconnect設定為true時,重試連線的次數 3 1.1
initialTimeout autoReconnect設定為true時,兩次重連之間的時間間隔,單位:秒 2 1.1
connectTimeout 和資料庫伺服器建立socket連線時的超時,單位:毫秒。 0表示永不超時,適用於JDK 1.4及更高版本 0 3.0.1
socketTimeout socket操作(讀寫)超時,單位:毫秒。 0表示永不超時 0 3.0.1

通常mysql連線URL可以設定為:
jdbc:mysql://localhost:3306/test?user=root&password=&useUnicode=true&characterEncoding=gbk&autoReconnect=true&failOverReadOnly=false

在使用資料庫連線池的情況下,最好設定如下兩個引數:
autoReconnect=true&failOverReadOnly=false

指定字元的編碼、解碼格式的作用。

例如:mysql資料庫用的是gbk編碼,而專案資料庫用的是utf-8編碼。這時候如果添加了useUnicode=true&characterEncoding=UTF-8 ,那麼作用有如下兩個方面:

1. 存資料時:

資料庫在存放專案資料的時候會先用UTF-8格式將資料解碼成位元組碼,然後再將解碼後的位元組碼重新使用GBK編碼存放到資料庫中。

2.取資料時:

在從資料庫中取資料的時候,資料庫會先將資料庫中的資料按GBK格式解碼成位元組碼,然後再將解碼後的位元組碼重新UTF-8格式編碼資料,最後再將資料返回給客戶端。

注意:在xml配置檔案中配置資料庫utl時,要使用&的轉義字元也就是&

例如:<property name="url" value="jdbc:mysql://localhost:3306/email?useUnicode=true&amp;characterEncoding=UTF-8" />


編碼知識:

ASCII碼:一共規定了128個字元的編碼,英語用128個符號編碼就夠了,只佔用了一個位元組的後面7位,最前面的1位統一規定為0。
Unicode:針對各國文字、符號進行統一性編碼。規定了符號的二進位制程式碼,卻沒有規定這個二進位制程式碼應該如何儲存,定長編碼對於儲存來說是極大的浪費。

GBK編碼:能夠用來同時表示繁體字和簡體字,而gb2312只能表示簡體字,gbk是相容gb2312編碼的。

UTF-8:是Unicode的實現方式之一,它是一種變長的編碼方式。它可以使用1~4個位元組表示一個符號,根據不同的符號而變化位元組長度。UTF-8的編碼規則很簡單,只有二條:

1)對於單位元組的符號,位元組的第一位設為0,後面7位為這個符號的unicode碼。因此對於英語字母,UTF-8編碼和ASCII碼是相同的。

2)對於n位元組的符號(n>1),第一個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10。剩下的沒有提及的二進位制位,全部為這個符號的unicode碼。

下表總結了編碼規則,字母x表示可用編碼的位。

Unicode符號範圍 | UTF-8編碼方式
(十六進位制) | (二進位制)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

下面,還是以漢字“嚴”為例,演示如何實現UTF-8編碼。

已知“嚴”的unicode是4E25(100111000100101),根據上表,可以發現4E25處在第三行的範圍內(0000 0800-0000 FFFF),因此“嚴”的UTF-8編碼需要三個位元組,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然後,從“嚴”的最後一個二進位制位開始,依次從後向前填入格式中的x,多出的位補0。這樣就得到了,“嚴”的UTF-8編碼是“11100100 10111000 10100101”,轉換成十六進位制就是E4B8A5。

參考