從 JDBC 驅動程式傳送到伺服器的所有字串,都會自動從原生 Java Unicode 格式轉換為連線的字元編碼,包括使用 Statement.execute()
、Statement.executeUpdate()
和 Statement.executeQuery()
傳送的所有查詢,以及所有 PreparedStatement
和 CallableStatement
參數,但不包括使用下列方法設定的參數
setBlob()
setBytes()
setClob()
setNClob()
setAsciiStream()
setBinaryStream()
setCharacterStream()
setNCharacterStream()
setUnicodeStream()
每個連線的編碼數量
Connector/J 支援用戶端和伺服器之間的單一字元編碼,以及伺服器在 ResultSets
中傳回給用戶端的資料的任意字元編碼數量。
設定字元編碼
針對 Connector/J 8.0.25 及更早版本: 用戶端和伺服器之間的字元編碼會在連線時自動偵測 (前提是未設定 Connector/J 連線屬性 characterEncoding
和 connectionCollation
)。伺服器上的編碼是使用系統變數 character_set_server
指定 (如需更多資訊,請參閱 伺服器字元集和定序),而驅動程式會自動使用該編碼。例如,若要將 4 位元組 UTF-8 字元集與 Connector/J 搭配使用,請將 MySQL 伺服器設定為 character_set_server=utf8mb4
,並將 characterEncoding
和 connectionCollation
從 Connector/J 連線字串中省略。然後,Connector/J 將自動偵測 UTF-8 設定。若要覆寫用戶端上自動偵測到的編碼,請在連線至伺服器的 URL 中使用 characterEncoding
屬性。
針對 Connector/J 8.0.26 及更新版本: 在連線初始化期間有兩個階段會設定字元編碼和定序。
-
驗證前階段: 在此階段中,用戶端和伺服器之間的字元編碼是由 Connector/J 連線屬性的設定所決定,依下列優先順序排列
如果未設定上述任何屬性,則設為
UTF8
(對應於 MySQL 伺服器上的utf8mb4
)
-
驗證後階段:在此階段中,用戶端和伺服器之間在剩餘工作階段的字元編碼是由 Connector/J 連線屬性的設定所決定,依下列優先順序排列
如果未設定上述任何屬性,則設為
UTF8
(對應於 MySQL 伺服器上的utf8mb4
)
這表示只有在設定
passwordCharacterEncoding
,但其設定與connectionCollation
的設定不同,或與characterEncoding
的設定不同時 (當未設定connectionCollation
時),或與utf8mb4
不同時 (當connectionCollation
和characterEncoding
都未設定時),Connector/J 才需要發出 SET NAMES Statement 來變更在驗證前階段中建立的字元集和定序。
自訂字元集和定序
若要支援在伺服器上使用自訂字元集和定序,請將 Connector/J 連線屬性 detectCustomCollations
設定為 true
,並提供自訂字元集和 Java 字元編碼之間的對應,方法是提供以逗號分隔的
配對清單 (例如: custom_charset
:java_encoding
customCharsetMapping=charset1:UTF-8,charset2:Cp1252
) 的 customCharsetMapping
連線屬性。
MySQL 到 Java 編碼名稱轉譯
指定字元編碼時,請使用 Java 樣式的名稱。下表列出 MySQL 字元集名稱及其對應的 Java 樣式名稱
表 6.21 MySQL 到 Java 編碼名稱轉譯
MySQL 字元集名稱 | Java 樣式字元編碼名稱 |
---|---|
ascii |
US-ASCII |
big5 |
Big5 |
gbk |
GBK |
sjis |
SJIS 或 Cp932 |
cp932 |
Cp932 或 MS932 |
gb2312 |
EUC_CN |
ujis |
EUC_JP |
euckr |
EUC_KR |
latin1 |
Cp1252 |
latin2 |
ISO8859_2 |
greek |
ISO8859_7 |
hebrew |
ISO8859_8 |
cp866 |
Cp866 |
tis620 |
TIS620 |
cp1250 |
Cp1250 |
cp1251 |
Cp1251 |
cp1257 |
Cp1257 |
macroman |
MacRoman |
macce |
MacCentralEurope |
utf8mb4 |
UTF-8 |
ucs2 |
UnicodeBig |
當在連線字串中將
UTF-8
用於characterEncoding
時,它會對應至 MySQL 字元集名稱utf8mb4
。如果也同時設定了連線選項
connectionCollation
和characterEncoding
,且兩者不相容,則characterEncoding
會被覆寫為對應於connectionCollation
的編碼。因為沒有 Java 樣式的字元集名稱可供您與連線選項
charaterEncoding
搭配使用,所以使用utf8mb3
作為連線字元集的唯一方法是,將utf8mb3
定序 (例如,utf8_general_ci
) 用於連線選項connectionCollation
,這會強制使用utf8mb3
字元集,如最後一個項目符號所述。
請勿在 Connector/J 中發出查詢 SET NAMES,因為驅動程式不會偵測到字元集已透過查詢變更,並會繼續使用首次設定連線時設定的字元集。