首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

紅旗 Linux DC 5.0 安裝 Oracle 10g 中文亂碼解決方案

     編輯:Oracle 資料庫基礎

紅旗 Linux DC 5.0 安裝 Oracle 10g:中文字元插入顯示問號的完整解決流程

在紅旗 Linux DC 5.0 (Asianux 2.0 核心) 上安裝 Oracle 10g R2 (10.2.0.1) 時,若資料庫字元集設定不當,中文資料插入後會全變成問號 (???)。本文記錄從字元集診斷到修正的完整過程。

問題現象

  • 執行 INSERT 中文資料,查詢結果全為 ???。
  • SELECT * FROM NLS_DATABASE_PARAMETERS 顯示 NLS_CHARACTERSET = WE8ISO8859P1 (西歐單位元組字元集,不支援中文)。
  • 嘗試用 ALTER DATABASE CHARACTER SET 改為 AMERICAN_AMERICA.US7ASCII (錯誤嘗試),問題依舊。

環境資訊

  • OS:紅旗 Linux DC 5.0 (Kernel 2.6.9-11.19AXsmp, x86_64, glibc 2.3.4)
  • CPU:Intel Xeon MP 2.83/3.16 GHz
  • Oracle:10g R2 (10.2.0.1.0) 64-bit

根本原因分析

  1. 資料庫字元集 (NLS_CHARACTERSET) 必須支援中文:WE8ISO8859P1、US7ASCII 均為單位元組字元集,無法儲存中文。
  2. 正確選擇:ZHS16GBK (簡體中文雙位元組)、ZHT16BIG5 (繁體)、AL32UTF8 (Unicode UTF-8,推薦新專案)。
  3. 字元集建立時決定:CREATE DATABASE 時指定,建立後通常不可變更 (除非重建或使用昂貴的 CSALTER 工具)。

解決方案:重建資料庫指定正確字元集

  1. 備份現有資料 (若有):EXPDP 匯出、冷備份檔案。
  2. 刪除現有資料庫 (DBCA → 刪除資料庫) 或直接重新安裝 Oracle 軟體。
  3. 使用 DBCA (Database Configuration Assistant) 建立新資料庫:
  • 字元集步驟選擇 「使用 Unicode (AL32UTF8)」 或 「ZHS16GBK」。
  • 國家字元集選 AL16UTF16 (預設)。
  • 完成建立。
  1. 驗證:
SQL> SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET%';
PARAMETER                      VALUE
------------------------------ ----------------
NLS_CHARACTERSET               AL32UTF8
NLS_NCHAR_CHARACTERSET         AL16UTF16
  1. 測試中文插入/查詢:
SQL> CREATE TABLE test_ch (col1 VARCHAR2(20));
SQL> INSERT INTO test_ch VALUES ('中文測試');
SQL> SELECT * FROM test_ch;
COL1
-------------------
中文測試

客戶端環境設定 (關鍵)

資料庫字元集正確後,客戶端 NLS_LANG 必須匹配:

  • Linux/Unix Shell:export NLS_LANG=AMERICAN_AMERICA.AL32UTF8 (或 .ZHS16GBK)
  • Windows 登錄:HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_... \NLS_LANG = AMERICAN_AMERICA.AL32UTF8
  • 應用程式連線字串:確保驅動程式 (OLE DB, ODBC, ODP.NET, JDBC) 正確傳遞字元集。

NLS_LANG 格式:語言_地區.字元集。三者必須與資料庫端、作業系統區域設定一致,否則會發生隱性轉換導致資料損壞。

常見誤區提醒

  • ALTER DATABASE CHARACTER SET 僅能從子集遷移到超集 (如 US7ASCII → AL32UTF8),WE8ISO8859P1 無法直接改為 AL32UTF8,會報錯或資料損壞。
  • NLS_CHARACTERSET ≠ NLS_NCHAR_CHARACTERSET:前者為資料庫預設字元集 (VARCHAR2/CHAR/CLOB),後者為國家字元集 (NCHAR/NVARCHAR2/NCLOB)。中文資料若存 N 欄位,需檢查後者。
  • 作業系統 Locale:LANG=zh_CN.UTF-8 或 zh_TW.UTF-8,影響終端機顯示與排序,但不直接決定資料庫儲存編碼。

總結檢查清單

  1. 資料庫建立時指定 AL32UTF8 (推薦) 或 ZHS16GBK。
  2. 客戶端 NLS_LANG 完全匹配 資料庫字元集。
  3. 應用程式連線驅動程式版本相容、正確處理 Unicode。
  4. 終端機/IDE 編碼設定為 UTF-8,避免顯示端誤判。

字元集問題預防勝於治療:新專案初始規劃即確定字元集,文檔化、納入部署腳本、自動化驗證。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved