ORACLE 【字符集正確設定及相關操作】_41

哎呀我的天吶發表於2014-11-17



作業系統有字符集

LINUX

[oracle@ycnode1 ~]$ locale

LANG=en_US.UTF-8

LC_CTYPE="en_US.UTF-8"

LC_NUMERIC="en_US.UTF-8"

LC_TIME="en_US.UTF-8"

LC_COLLATE="en_US.UTF-8"

LC_MONETARY="en_US.UTF-8"

LC_MESSAGES="en_US.UTF-8"

LC_PAPER="en_US.UTF-8"

LC_NAME="en_US.UTF-8"

LC_ADDRESS="en_US.UTF-8"

LC_TELEPHONE="en_US.UTF-8"

LC_MEASUREMENT="en_US.UTF-8"

LC_IDENTIFICATION="en_US.UTF-8"

LC_ALL=

 

作業系統上檢視支援所有的字符集:
linux:

[oracle@ycnode1 ~]$ locale -a

 

windows:

C:\Users\Administrator>chcp

活動內碼表: 936

 

ORACLE字符集

(1)用來儲存charvarchar2 clob long等資料型別

(2)用來標識諸如表名、列名以及PL/SQL等變數

(3)用來儲存SQLPL/SQL程式單元等。

國際字符集

(1)用以儲存NCHARNVARCHAR2NCLOB等資料型別。

如果一個表的型別是charvarchar2 clob long型別那麼使用資料庫字符集

如果表的資料型別是NCHARNVARCHAR2NCLOB那麼使用國家字符集


點選(此處)摺疊或開啟

  1. SQL> select * from nls_database_parameters;
  2. PARAMETER                      VALUE
  3. ------------------------------ -----------------------------
  4. NLS_LANGUAGE                   AMERICAN
  5. NLS_TERRITORY                  AMERICA
  6. NLS_CURRENCY                   $
  7. NLS_ISO_CURRENCY               AMERICA
  8. NLS_NUMERIC_CHARACTERS         .,
  9. NLS_CHARACTERSET               AL32UTF8 資料庫字符集
  10. NLS_CALENDAR                   GREGORIAN
  11. NLS_DATE_FORMAT                DD-MON-RR
  12. NLS_DATE_LANGUAGE              AMERICAN
  13. NLS_SORT                       BINARY
  14. NLS_TIME_FORMAT                HH.MI.SSXFF AM
  15. NLS_TIMESTAMP_FORMAT           DD-MON-RR HH.MI.SSXFF AM
  16. NLS_TIME_TZ_FORMAT             HH.MI.SSXFF AM TZR
  17. NLS_TIMESTAMP_TZ_FORMAT        DD-MON-RR HH.MI.SSXFF AM TZR
  18. NLS_DUAL_CURRENCY              $
  19. NLS_COMP                       BINARY
  20. NLS_LENGTH_SEMANTICS           BYTE
  21. NLS_NCHAR_CONV_EXCP            FALSE
  22. NLS_NCHAR_CHARACTERSET         AL16UTF16 國家字符集
  23. NLS_RDBMS_VERSION              11.2.0.3.0
  24. 20 rows selected


國家字符集使用的比較少,一般使用的都是資料庫字符集。國際字符集只是對資料庫字符集的補充。

 

Oracle的字符集命名遵循以下命名規則:

<語言><位元位數><編碼>

比如:ZHS16GBK表示採用GBK編碼格式、16位(兩個位元組)簡體中文字符集

US7ASCII  只能儲存美國人使用的字元,不超過 128

Zhs16cgb231280 中文字符集比較老,並沒有儲存所有的

 

ZHS16GBK 最新的中文字符集,超集(GBK國標)

Utf8 unicode字符集,比如外企需求儲存各國人的名字,就用UTF8

繁體字符集,香港大五碼,臺灣
AL32UTF8 最全的字符集,資料庫字符集用它,這個比Utf8多的多(跨國企業用這個,效率低)
ZHS16GBK 最新的中文字符集,超集(只存中文就用這個)
AF16UTF16(國家字符集用它)

點選(此處)摺疊或開啟

  1. SQL> select * from v$nls_valid_values;

  2. PARAMETER         VALUE                 ISDEP
  3. ------------------------------ ------------------------------ -----
  4. LANGUAGE         AMERICAN               FALSE
  5. LANGUAGE         GERMAN                 FALSE
  6. LANGUAGE         FRENCH                 FALSE
  7. LANGUAGE         CANADIAN FRENCH        FALSE
  8. LANGUAGE         SPANISH                FALSE
  9. LANGUAGE         ITALIAN                FALSE
  10. LANGUAGE         DUTCH                  FALSE
  11. LANGUAGE         SWEDISH                FALSE
  12. LANGUAGE         NORWEGIAN              FALSE
  13. LANGUAGE         DANISH                 FALSE
  14. LANGUAGE         FINNISH                FALSE
  15. LANGUAGE         ICELANDIC              FALSE
  16. LANGUAGE         GREEK                  FALSE
  17. LANGUAGE         PORTUGUESE             FALSE
  18. LANGUAGE         TURKISH                FALSE
  19. LANGUAGE         BRAZILIAN PORTUGUESE   FALSE
  20. LANGUAGE         MEXICAN SPANISH        FALSE
  21. LANGUAGE         RUSSIAN                FALSE
  22. LANGUAGE         POLISH                 FALSE
  23. LANGUAGE         HUNGARIAN              FALSE
  24. LANGUAGE         CZECH                  FALSE
  25. LANGUAGE         LITHUANIAN             FALSE
  26. LANGUAGE         SLOVAK                 FALSE
  27. LANGUAGE         CATALAN                FALSE
  28. LANGUAGE         BULGARIAN              FALSE
  29. LANGUAGE         ROMANIAN               FALSE
  30. LANGUAGE         SLOVENIAN              FALSE
  31. LANGUAGE         HEBREW                 FALSE
  32. LANGUAGE         EGYPTIAN               FALSE
  33. LANGUAGE         CROATIAN               FALSE
  34. LANGUAGE         ARABIC                 FALSE
  35. LANGUAGE         THAI                   FALSE
  36. LANGUAGE         JAPANESE               FALSE
  37. LANGUAGE         KOREAN                 FALSE
  38. LANGUAGE         SIMPLIFIED CHINESE     FALSE
  39. LANGUAGE         TRADITIONAL CHINESE    FALSE
  40. LANGUAGE         ENGLISH                FALSE
  41. LANGUAGE         LATIN AMERICAN SPANISH FALSE
  42. LANGUAGE         UKRAINIAN              FALSE
  43. LANGUAGE         ESTONIAN               FALSE
  44. LANGUAGE         GERMAN DIN             FALSE
  45. LANGUAGE         MALAY                  FALSE
  46. LANGUAGE         VIETNAMESE             FALSE
  47. LANGUAGE         BENGALI                TRUE
  48. LANGUAGE         LATVIAN                FALSE
  49. LANGUAGE         INDONESIAN             FALSE
  50. LANGUAGE         HINDI                  FALSE
  51. LANGUAGE         TAMIL                  FALSE
  52. LANGUAGE         KANNADA                FALSE
  53. LANGUAGE         TELUGU                 FALSE
  54. LANGUAGE         ORIYA                  FALSE
  55. LANGUAGE         MALAYALAM              FALSE
  56. LANGUAGE         ASSAMESE               FALSE
  57. LANGUAGE         GUJARATI               FALSE
  58. LANGUAGE         MARATHI                FALSE
  59. LANGUAGE         PUNJABI                FALSE
  60. LANGUAGE         BANGLA                 FALSE
  61. LANGUAGE         AZERBAIJANI            FALSE
  62. LANGUAGE         MACEDONIAN             FALSE
  63. LANGUAGE         CYRILLIC SERBIAN       FALSE
  64. LANGUAGE         LATIN SERBIAN          FALSE
  65. LANGUAGE         CYRILLIC UZBEK         FALSE
  66. LANGUAGE         LATIN UZBEK            FALSE
  67. LANGUAGE         CYRILLIC KAZAKH        FALSE
  68. LANGUAGE         ALBANIAN               FALSE
  69. TERRITORY         AMERICA               FALSE
  70. TERRITORY         UNITED KINGDOM        FALSE
  71. TERRITORY         GERMANY               FALSE
  72. TERRITORY         FRANCE                FALSE
  73. TERRITORY         CANADA                FALSE
  74. TERRITORY         SPAIN                 FALSE
  75. TERRITORY         ITALY                 FALSE
  76. TERRITORY         THE NETHERLANDS       FALSE
  77. TERRITORY         SWEDEN                FALSE
  78. TERRITORY         NORWAY                FALSE
  79. TERRITORY         DENMARK               FALSE
  80. TERRITORY         FINLAND               FALSE
  81. TERRITORY         ICELAND               FALSE
  82. TERRITORY         GREECE                FALSE
  83. TERRITORY         PORTUGAL              FALSE
  84. TERRITORY         TURKEY                FALSE
  85. TERRITORY         BRAZIL                FALSE
  86. TERRITORY         MEXICO                FALSE
  87. TERRITORY         CIS                   TRUE
  88. TERRITORY         CROATIA               FALSE
  89. TERRITORY         POLAND                FALSE
  90. TERRITORY         HUNGARY               FALSE
  91. TERRITORY         CZECHOSLOVAKIA        TRUE
  92. ... ...

  93. 496 rows selected.


資料庫支援這麼多字符集。

 

如果軟體有字符集,那麼資料庫字符集就不用了,sqlplus沒有字符集,那麼sqlplus使用作業系統字符集。

我們研究客戶端作業系統和資料庫的字符集。

sqlplus客戶端登陸伺服器結構:所有字符集的轉換都在oracle端進行的。



你把客戶端設定成16gbkORACLE就認為客戶端是16gbk,客戶端真正的字符集不是這個,他的作用只是傳話,使得oracle認為客戶端就是16gbk

 客戶端字符集通常中文字符集、utf8
 NLS_LANG的設定就是將其設定成客戶端作業系統的字符集。

 圖片

平時用的時候發現沒有問題,客戶端作業系統將”其“轉換成A4,然後A4傳到資料庫,資料庫問客戶端你用什麼編碼編的,客戶端說我用UTF8 然後oracle將A4直接存到資料庫中。使用的時候不報錯。
 不論oracle儲存還是讀取都經過NLS_LANG


[oracle@linux6 ~]$ export NLS_LANG=american_america.utf8
 

sqlplus本身沒有字符集,他參考客戶端作業系統的字符集。如果軟體有字符集,那麼軟體就不參考資料庫的字符集。

所有的字符集轉換都是在oracle端發生的。

當我們在sqlplus中輸入中文“中國”的時候,被作業系統編碼,編碼出幾個數字,編碼從客戶端傳到oracle,oracle拿到編碼,轉化成字符集,oracle必須知道這個編碼是由什麼編的。

結論:如果客戶端字符集和資料庫字符集一樣,那麼資料庫直接儲存傳過來的編碼;如果客戶端是zhs16gbk,資料庫是utf-8,那麼傳過來的是zhs16gbk編碼,在資料庫端轉化成zhs16gbk的字元,然後這些字元再轉化成utf-8的編碼,儲存到表中。(資料庫儲存時,儲存的是編碼

NLS_LANG 這個引數在客戶端設的。oracle想要知道作業系統的字符集,這個引數設定成16gbk,那麼oracle就認為你的客戶端作業系統的字符集就是zhs16gbk。
NLS_LANG的引數設定的和客戶端一樣。

這是最隱蔽的一個錯誤。


點選(此處)摺疊或開啟

  1. SQL> select ename , job , dump(ename ,1016) from emp;
  2. ENAME  JOB        DUMP(ENAME,1016)
  3. ---------- --------- --------------------------------------------------------------------------------
  4. 姚崇    CLERK     Typ=1 Len=4 CharacterSet=ZHS16GBK: d2,a6,b3,e7
  5. 姚崇    SALESMAN  Typ=1 Len=4 CharacterSet=ZHS16GBK: d2,a6,b3,e7
16進位制顯示。

當儲存的時候發生轉換時錯誤的,那麼這個是非常危險的!!!

點選(此處)摺疊或開啟

  1. SQL> select dump(\'姚崇\',1016) from dual;
  2. DUMP(\'姚崇\',1016)
  3. -----------------------------------------------
  4. Typ=96 Len=4 CharacterSet=ZHS16GBK: d2,a6,b3,e7
windows:
set
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK

AMERICAN的意思是oracle反饋資訊,比如登入報錯的提示資訊是用什麼語言提示的。
AMERICA 貨幣符號,日期格式用美國的格式,貨幣等等。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29990276/viewspace-1336101/,如需轉載,請註明出處,否則將追究法律責任。

相關文章