天天看點

徹底解決Oracle中文亂碼影響Oracle編碼的配置有3處:問題複現:問題修正問題分析問題總結

服務端字元集

作業系統字元集

NLS_LANG字元集

SELECT * FROM NLS_DATABASE_PARAMETERS

locale

export

american_america.AL32UTF8

en_US.UTF-8

AMERICAN_AMERICA.ZHS16GBK

服務端字元集,NLS_CHARACTERSET: ZHS16GBK。

用戶端os locale:LANG="en_US.UTF-8”。

環境變量NLS_LANG 沒有配置。

插件中文INSERT INTO mysql_test_10 VALUES (2, '中國');中文是UTF-8編碼。

讀取中文select * from mysql_test_10,發現顯示亂碼。

檢查oracle存儲的編碼,發現存儲編碼錯誤。

正确的UTF編碼(中國e4,b8,ad,e5,9b,bd)GBK編碼(d6,d0,b9,fa)

設定NLS_LANG與用戶端os字元集相同。

NLS_LANG=american_america.AL32UTF8;

client端使用UTF8編碼,發送到Oracle server端後,server端讀取NLS_LANG是空後,直接用GBK編碼了資料,于是存儲時,字元就錯亂了,大小6位元組。

設定NLS_LANG=american_america.AL32UTF8後,server端會先到UTF8編碼表中查詢,翻譯後以GBK編碼存儲,大小4位元組。

NLS_LANG 與用戶端os字元集要保持一緻。

為了減少翻譯開銷,最好“服務端字元集”,“用戶端os字元集”和NLS_LANG,3者保持一緻。

歡迎加入橙鷹資料, [email protected]

<a href="https://www.cnblogs.com/xdouby/p/5666624.html">https://www.cnblogs.com/xdouby/p/5666624.html</a>

<a href="https://www.cnblogs.com/bingo1717/p/7803359.html">https://www.cnblogs.com/bingo1717/p/7803359.html</a>