NLS_LANG數(shù)據(jù)庫字符集中文亂碼問題分析和解決

前言

已經(jīng)有3年多沒再關(guān)心或者遇到編碼格式的問題了俱两,一是離Oracle數(shù)據(jù)庫操作遠(yuǎn)了冒晰,二是現(xiàn)在的Terminal缔御,IDE和操作系統(tǒng)語言環(huán)境配置都很標(biāo)準(zhǔn)惜颇,比如清一色的UTF-8編碼和UNIX(LF)皆刺,我自己的組合是以下形式,Xmanager + Visual Studio Code/Notepad2 + 增加中文語言包顯示的操作系統(tǒng)凌摄,Oracle zhs16gbk芹橡,MySQL utf8,Python 2/3 utf-8望伦。本來應(yīng)該是非常統(tǒng)一而和諧的開發(fā)環(huán)境因?yàn)閟qlplus spool導(dǎo)出中文內(nèi)容而又變更混沌林说,索性再徹底分析以下中文亂碼的源頭和解決方案。

保持操作系統(tǒng)屯伞,終端登錄腿箩,數(shù)據(jù)庫3者編碼格式一致性很重要

更新記錄

2017年09月06日 - 初稿

閱讀原文 - https://wsgzao.github.io/post/lang/

Locale

下面2個(gè)地址對(duì)Locale語言字符集的介紹已經(jīng)很清晰了,我只強(qiáng)調(diào)2點(diǎn)

  1. 大多數(shù)UNIX操作系統(tǒng)建議默認(rèn)顯示語言為英語劣摇,但是一定要添加中文語言支持包
  2. 顯示中文亂碼多數(shù)原因是操作系統(tǒng)LANG環(huán)境變量或者類似Xshell編碼不統(tǒng)一造成的

Locale - http://wiki.ubuntu.org.cn/Locale
Localization - https://wiki.gentoo.org/wiki/Localization/Guide

NLS_LANG

本次遇到的問題主要是由于使用sqlplus spool從Oracle數(shù)據(jù)庫導(dǎo)出中文數(shù)據(jù)引發(fā)連鎖問題珠移,雖然和數(shù)據(jù)庫相關(guān)但是解決中文亂碼的思路基本上是一致的,方便各位以后可以借鑒和參考末融。


# 源主機(jī):CentOS 6.8 已安裝中文語言包钧惧,保持LANG和NLS_LANG默認(rèn)環(huán)境變量,Oracle Instant Client 12.2.0.1.0勾习,已安裝sqlplus
echo $LANG
en_US.UTF-8

echo $NLS_LANG
空

# 數(shù)據(jù)庫服務(wù)器:Oracle Database 11.2.0.3.0浓瞪,NLS_CHARACTERSET ZHS16GBK
sqlplus system/oracle@orabiz

SQL> select * from v$nls_parameters;

PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_LANGUAGE
AMERICAN

NLS_TERRITORY
AMERICA

NLS_CURRENCY
$


PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_ISO_CURRENCY
AMERICA

NLS_NUMERIC_CHARACTERS
.,

NLS_CALENDAR
GREGORIAN


PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_DATE_FORMAT
DD-MON-RR

NLS_DATE_LANGUAGE
AMERICAN

NLS_CHARACTERSET
ZHS16GBK


PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_SORT
BINARY

NLS_TIME_FORMAT
HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT
DD-MON-RR HH.MI.SSXFF AM


PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_TIME_TZ_FORMAT
HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT
DD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY
$


PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_NCHAR_CHARACTERSET
AL16UTF16

NLS_COMP
BINARY

NLS_LENGTH_SEMANTICS
BYTE


PARAMETER
----------------------------------------------------------------
VALUE
----------------------------------------------------------------
NLS_NCHAR_CONV_EXCP
FALSE


19 rows selected.

問題1:ORA-12705

ERROR:
ORA-12705: Cannot access NLS data files or invalid environment specified

12705, 00000, "Cannot access NLS data files or invalid environment specified"
// *Cause: Either an attempt was made to issue an ALTER SESSION command
//         with an invalid NLS parameter or value; or the environment
//         variable(s) NLS_LANG, ORA_NLSxx, or ORACLE_HOME was incorrectly
//         specified, therefore the NLS data files cannot be located.
// *Action: Check the syntax of the ALTER SESSION command and the NLS
//          parameter, correct the syntax and retry the statement, or
//          specify the correct directory path/values in the environment
//          variables.

根據(jù)以上Oracle官方提示,合理的解決思路大致是這樣

  1. 檢查數(shù)據(jù)庫服務(wù)器的NLS parameter
  2. 在客戶端中配置與服務(wù)端匹配的NLS_LANG

比如我的環(huán)境就需要配置

export NLS_LANG="american_america.zhs16gbk"

它的格式如下:NLS_LANG=language_territory.charset
它有三個(gè)組成部分(語言巧婶、地域和字符集)乾颁,每個(gè)成分控制了NLS子集的特性。
Language:指定服務(wù)器消息的語言艺栈, 影響提示信息是中文還是英文
Territory:指定服務(wù)器的日期和數(shù)字格式英岭,
Charset:指定字符集。
如:AMERICAN_AMERICA.ZHS16GBK, SIMPLIFIED CHINESE_CHINA.ZHS16GBK

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

從NLS_LANG的組成我們可以看出湿右,真正影響數(shù)據(jù)庫字符集的其實(shí)是第三部分诅妹。
所以兩個(gè)數(shù)據(jù)庫之間的字符集只要第三部分一樣就可以相互導(dǎo)入導(dǎo)出數(shù)據(jù),前面影響的只是提示信息是中文還是英文毅人。

問題2:VI打開文件中文亂碼

其實(shí)這個(gè)問題就是由第一個(gè)問題引申出來的吭狡,主要和LANG環(huán)境變量有關(guān)

Locale 是軟件在運(yùn)行時(shí)的語言環(huán)境, 它包括語言(Language), 地域 (Territory) 和字符集(Codeset)尖殃。
一個(gè)locale的書寫格式為: 語言[_地域[.字符集]].

zh_CN.GB2312=中文_中華人民共和國+國標(biāo)2312字符集。
我說中文赵刑,身處中國大陸分衫,使用國標(biāo)2312字符集來表達(dá)字符。

zh_TW.BIG5=中文_臺(tái)灣.大五碼字符集
我說中文般此,身處臺(tái)灣地區(qū)蚪战,使用Big5字符集來表達(dá)字符。

根據(jù)以上信息合理的解決思路大致是這樣

  1. 檢查操作系統(tǒng)是否已添加中文語言包
  2. 檢查SecureCRT/Xshell等終端編碼是否為默認(rèn)編碼或UTF-8
  3. 檢查LANG環(huán)境變量是否合適

比如我的環(huán)境就需要配置铐懊,為什么不加zh_CN.UTF-8邀桑,你猜呢

export LANG=zh_CN
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市科乎,隨后出現(xiàn)的幾起案子壁畸,更是在濱河造成了極大的恐慌,老刑警劉巖茅茂,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捏萍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡空闲,警方通過查閱死者的電腦和手機(jī)令杈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碴倾,“玉大人逗噩,你說我怎么就攤上這事〉疲” “怎么了异雁?”我有些...
    開封第一講書人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長僧须。 經(jīng)常有香客問我纲刀,道長,這世上最難降的妖魔是什么皆辽? 我笑而不...
    開封第一講書人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任柑蛇,我火速辦了婚禮,結(jié)果婚禮上驱闷,老公的妹妹穿的比我還像新娘。我一直安慰自己空免,他們只是感情好空另,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蹋砚,像睡著了一般扼菠。 火紅的嫁衣襯著肌膚如雪摄杂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評(píng)論 1 290
  • 那天循榆,我揣著相機(jī)與錄音析恢,去河邊找鬼。 笑死秧饮,一個(gè)胖子當(dāng)著我的面吹牛映挂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盗尸,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼柑船,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了泼各?” 一聲冷哼從身側(cè)響起鞍时,我...
    開封第一講書人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎扣蜻,沒想到半個(gè)月后逆巍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡莽使,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年锐极,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吮旅。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溪烤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庇勃,到底是詐尸還是另有隱情檬嘀,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布责嚷,位于F島的核電站鸳兽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏罕拂。R本人自食惡果不足惜揍异,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望爆班。 院中可真熱鬧衷掷,春花似錦、人聲如沸柿菩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至懦胞,卻和暖如春替久,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躏尉。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來泰國打工蚯根, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胀糜。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓颅拦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親僚纷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矩距,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Java編碼中的中文問題是一個(gè)老生常談的問題了,每次遇到中文亂碼LZ要么是按照以前的經(jīng)驗(yàn)修改怖竭,要么則是baidu....
    皓云觀閱讀 758評(píng)論 2 3
  • 1锥债、引言 數(shù)據(jù)庫設(shè)計(jì)過程中表、字段等的命名規(guī)范也算是設(shè)計(jì)規(guī)范的一部分痊臭,不過設(shè)計(jì)規(guī)范更多的是為了確保數(shù)據(jù)庫設(shè)計(jì)的合理...
    SnowflakeCloud閱讀 40,961評(píng)論 0 48
  • 好多好多年哮肚,步履急促,走在所謂人生的道路上广匙。一路的風(fēng)塵遮蓋了本該年輕的面貌允趟,等真正停下來的時(shí)候才發(fā)現(xiàn),原...
    頑塵閱讀 278評(píng)論 0 4
  • 我是一片海 比海寬廣的是天空 我尋找天空 生生世世不眠不休 我累我安寧 孤風(fēng)易疏雨 我哭我咆哮 滄海亦桑田 ~ 海...
    小野貓secret閱讀 183評(píng)論 0 0
  • “節(jié)目安排人什么情況啊抗碰,能不能換個(gè)人來演我男盆友,這樣我都不想演了绽乔。換個(gè)顏值高的來弧蝇,這樣入戲快!” 隔著屏幕看著群...
    進(jìn)擊的M先生丶閱讀 354評(píng)論 0 0