Oracle字符集
ZHS16GBK > ZHS16CGB231280
国际标准中,前者包含后者;在Oracle中不是直接包含关系,不能直接将gb231280转成gbk。
Exp和Imp时,要保证以下四个字符集设置:
1、源数据库的字符集
2、操作Exp的计算机的NLS_LANG环境变量
3、操作Imp的计算机的NLS_LANG环境变量
4、目标数据库的字符集
注1:查看数据库字符集
select * from nls_database_parameters,“NLS_CHARACTERSET"对应的值就是字符集。
注2:修改Oracle字符集
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
(注意:使用”update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';,然后commit重启服务器“这种方式修改Oracle字符集存在很大隐患,可能导致各种不确定错误,不可使用。)
Oracle字符集说明:
Oracle NLS_CHARACTERSET value
Language
ZHS16CGB231280
Chinese Simplified (GB2312)
gb2312
chinese, csGB2312, csISO58GB231280, GB2312, GB_2312-80, iso-ir-58
ZHS16GBK
Chinese Simplified (Windows)
windows-9361
windows-936
ZHT16BIG5
Chinese Traditional
big5
csbig5, x-x-big5
ZHT16MSWIN950
Chinese Traditional
windows-950
ISO2022-CN
Chinese
iso-2022-cn2
csISO2022CN
ZHT32EUC
Chinese Traditional (EUC-TW)
EUC-TW1
ISO2022-JP
Japanese (JIS)
JA16EUC
Japanese (EUC)
JA16SJIS
Japanese (Shift-JIS)
KO16KSC5601
Korean
ISO2022-KR
Korean (ISO)
KO16MSWIN949
Korean (Windows)
UTF8
Universal (UTF-8)
utf-8
unicode-1-1-utf-8, unicode-2-0-utf-8, x-unicode-2-0-utf-8
注3:修改客户端字符集
查看环境变量:set命令
修改环境变量:
A:Linux / Unix
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export NLS_LANG
B:Windows
set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
说明:Oracle通过NLS_LANG来设置客户端字符集,NLS_LANG由以下部分组成:NLS_LANG=<Language>_<Territory>.<Clients Characterset>,例如NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。
打开注册表:HKEY_LOCAL_MACHINE|SOFTWARE|ORACLE,修改注册表下nls_lang键值(包括oracle下、ID0和HOME0下的nls_lang都修改)
实例一(ZHS16CGB231280->ZHS16GBK):
1、问题:从源数据库(Oracle9i,ZHS16CGB231280字符集)直接使用exp导出dmp文件,然后imp导入到目标数据库(Oracle10g,ZHS16GBK字符集)后,表数据的中文没问题,但表结构的注释等中文信息变成了一堆问号。
2、解决:使用exp导出前,先设置系统环境变量:NLS_LANG=AMERICAN_AMERICA.ZHS16GBK,然后执行exp导出。这种方式导出的dmp文件复制到目标数据库服务器,使用imp导入后,表数据和表结构等中文信息都是正常中文了。
实例二(ZHS16GBK->ZHS16CGB231280):
1、问题:从源数据库(Oracle10g,ZHS16GBK)使用exp导出dmp文件,然后imp到目标库(Oracle9i,ZHS16CGB231280)时不成功,提示文件格式不正确。原因:高版本exp导出的dmp文件不能使用低版本imp进行导入。
2、解决:使用Oracle9i的exp来导出10g的数据。由于9i所在数据库服务器环境变量设置NLS_LANG=AMERICAN,导致在9i服务器上查询10g的表时,表内中文数据无法显示(一堆问号),这时可设置环境变量EXPORT NLS_LANG=AMERICAN_AMERICA.ZHS16GBK,此时中文显示就正常了。然后使用9i的exp导出10g数据,然后imp导入到9i中,成功,表数据和表结构注释等中文显示都没问题。
ZHS16GBK > ZHS16CGB231280
国际标准中,前者包含后者;在Oracle中不是直接包含关系,不能直接将gb231280转成gbk。
Exp和Imp时,要保证以下四个字符集设置:
1、源数据库的字符集
2、操作Exp的计算机的NLS_LANG环境变量
3、操作Imp的计算机的NLS_LANG环境变量
4、目标数据库的字符集
注1:查看数据库字符集
select * from nls_database_parameters,“NLS_CHARACTERSET"对应的值就是字符集。
注2:修改Oracle字符集
SQL> ALTER DATABASE CHARACTER SET ZHS16GBK;
(注意:使用”update props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';,然后commit重启服务器“这种方式修改Oracle字符集存在很大隐患,可能导致各种不确定错误,不可使用。)
Oracle字符集说明:
Oracle NLS_CHARACTERSET value
Language
ZHS16CGB231280
Chinese Simplified (GB2312)
gb2312
chinese, csGB2312, csISO58GB231280, GB2312, GB_2312-80, iso-ir-58
ZHS16GBK
Chinese Simplified (Windows)
windows-9361
windows-936
ZHT16BIG5
Chinese Traditional
big5
csbig5, x-x-big5
ZHT16MSWIN950
Chinese Traditional
windows-950
ISO2022-CN
Chinese
iso-2022-cn2
csISO2022CN
ZHT32EUC
Chinese Traditional (EUC-TW)
EUC-TW1
ISO2022-JP
Japanese (JIS)
JA16EUC
Japanese (EUC)
JA16SJIS
Japanese (Shift-JIS)
KO16KSC5601
Korean
ISO2022-KR
Korean (ISO)
KO16MSWIN949
Korean (Windows)
UTF8
Universal (UTF-8)
utf-8
unicode-1-1-utf-8, unicode-2-0-utf-8, x-unicode-2-0-utf-8
注3:修改客户端字符集
查看环境变量:set命令
修改环境变量:
A:Linux / Unix
NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export NLS_LANG
B:Windows
set NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
说明:Oracle通过NLS_LANG来设置客户端字符集,NLS_LANG由以下部分组成:NLS_LANG=<Language>_<Territory>.<Clients Characterset>,例如NLS_LANG=AMERICAN_AMERICA.ZHS16GBK。
打开注册表:HKEY_LOCAL_MACHINE|SOFTWARE|ORACLE,修改注册表下nls_lang键值(包括oracle下、ID0和HOME0下的nls_lang都修改)
实例一(ZHS16CGB231280->ZHS16GBK):
1、问题:从源数据库(Oracle9i,ZHS16CGB231280字符集)直接使用exp导出dmp文件,然后imp导入到目标数据库(Oracle10g,ZHS16GBK字符集)后,表数据的中文没问题,但表结构的注释等中文信息变成了一堆问号。
2、解决:使用exp导出前,先设置系统环境变量:NLS_LANG=AMERICAN_AMERICA.ZHS16GBK,然后执行exp导出。这种方式导出的dmp文件复制到目标数据库服务器,使用imp导入后,表数据和表结构等中文信息都是正常中文了。
实例二(ZHS16GBK->ZHS16CGB231280):
1、问题:从源数据库(Oracle10g,ZHS16GBK)使用exp导出dmp文件,然后imp到目标库(Oracle9i,ZHS16CGB231280)时不成功,提示文件格式不正确。原因:高版本exp导出的dmp文件不能使用低版本imp进行导入。
2、解决:使用Oracle9i的exp来导出10g的数据。由于9i所在数据库服务器环境变量设置NLS_LANG=AMERICAN,导致在9i服务器上查询10g的表时,表内中文数据无法显示(一堆问号),这时可设置环境变量EXPORT NLS_LANG=AMERICAN_AMERICA.ZHS16GBK,此时中文显示就正常了。然后使用9i的exp导出10g数据,然后imp导入到9i中,成功,表数据和表结构注释等中文显示都没问题。