[20180502]UTF8編碼問題.txt

lfree發表於2018-05-02

[20180502]UTF8編碼問題.txt

--//上個星期匯入執行語句時遇到的問題,做一個記錄,開發的指令碼使用是UTF8編碼,而我們的資料庫使用
--//NLS_Lang=AMERICAN_AMERICA.ZHS16GBK,還是透過例子說明問題.

1.環境:
SCOTT@book> @ &r/ver1

PORT_STRING                    VERSION        BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

SCOTT@book> create table t as select rowid id ,'test' name from dual connect by level<=10;
Table created.

2.建立測試指令碼:
--//使用putty登入,設定字元編碼UTF-8.
--//登入定義環境變數如下: export LANG=en_US.UTF-8
--//建立檔案.
$ cat a.txt
COMMENT ON COLUMN t.name IS '名字';

$ file a.txt
a.txt: UTF-8 Unicode text

SCOTT@book> @ a.txt
Comment created.

SCOTT@book> select * from user_col_comments where table_name='T';
TABLE_NAME COLUMN_NAME          COMMENTS
---------- -------------------- ------------------------------
T          ID
T          NAME                 名字

--//如果你在export LANG=en_US環境看到的就是亂碼.
SCOTT@book> select * from user_col_comments where table_name='T';
TABLE_NAME COLUMN_NAME          COMMENTS
---------- -------------------- ------------------------------
T          ID
T          NAME                 鍚嶅瓧

3.如果你在windows下使用記事本編輯:
--//方法是開啟檔案編輯後選擇另存為UTF-8格式.

R:\>cat a.txt
鍩?


COMMENT ON COLUMN t.name IS '鍚嶅瓧';

--//可以發現開頭存在一些亂字元.

SCOTT@78> @ a.txt
SP2-0042: unknown command "鍩?" - rest of line ignored.
Comment created.

--//使用vim開啟刪除前面部分.但是前面依舊存在亂碼
R:\>cat a.txt
鍩縞omment on column t.name IS '鍚嶅瓧';

--//這個不要緊,一般指令碼存在多行,在複製一行看看.

R:\>cat a.txt
鍩縞omment on column t.name IS '鍚嶅瓧';
comment on column t.name IS '鍚嶅瓧';

SCOTT@78> column COMMENTS format a30;
SCOTT@78> select * from user_col_comments where table_name='T';
TABLE_NAME COLUMN_NAME          COMMENTS
---------- -------------------- ------------------------------
T          ID
T          NAME                 鍚嶅瓧

--//如果在UTF8下檢視,可以發現顯示正常.
SCOTT@book> select * from user_col_comments where table_name='T';
TABLE_NAME COLUMN_NAME          COMMENTS
---------- -------------------- ------------------------------
T          ID
T          NAME                 名字

--//實際上這個應該注意,一些開發喜歡提交的指令碼是UTF8編碼,不是講這個不好,實際上使用在windows下使用vim時已經暴露一些細節,
--//出現[converted]字樣.
--//而在linux下編輯就沒有前面的亂碼.僅僅做一個記錄,不然匯入一堆亂碼註解,再重新整理還是浪費一些時間.
--//把在windows下編輯的檔案複製到linux伺服器,也是一樣看不到前面的亂碼.

# cat a.txt
comment on column t.name IS '名字';
comment on column t.name IS '名字';

# xxd -c 16 a.txt
0000000: efbb bf63 6f6d 6d65 6e74 206f 6e20 636f  ...comment on co
0000010: 6c75 6d6e 2074 2e6e 616d 6520 4953 2027  lumn t.name IS '
0000020: e590 8de5 ad97 273b 0d0a 636f 6d6d 656e  ......';..commen
0000030: 7420 6f6e 2063 6f6c 756d 6e20 742e 6e61  t on column t.na
0000040: 6d65 2049 5320 27e5 908d e5ad 9727 3b0d  me IS '......';.
0000050: 0a                                       .

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

相關文章