[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 .