sqlldr 导入乱码 Oracle客户端字符集问题
1,查Oracle数据库创建时候的字符集:
Oracle服务器端执行
SQL> select name, value$ from sys.props$ where name like 'NLS%';
NAME VALUE$
------------------------------ ----------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET UTF8
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NAME VALUE$
------------------------------ ----------------------------------------
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 10.2.0.4.0
20 rows selected.
确认数据库创建的时候选择的字符集是 UTF-8
.执行sql :select userenv('language') from dual; 获取oracle服务端字符集X
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.UTF8
2. 检查执行 sqlldr 的客户端的 NLS_LANG 的设置
Oracle 客户端执行
[oracle@localhost hx]$ echo $NLS_LANG
AMERICAN_AMERICA.UTF8
3. 尽量让以上3个步骤检查出的字符集设置都一致,开始通过 sqlldr 导入文本,并检查结果。
通常出现问题的原因,可分为三种:
1. 服务器指定字符集与客户字符集不同,而与加载数据字符集一致。
解决方法:对于这种情况,只需要设置客户端字符集与服务器端字符集一致就可以了
oracle10g UTF8编码:AMERICAN_AMERICA.AL32UTF8
1.LANG=zh_CN
2.NLS_LANG=zhs16gbk
2. 服务器指定字符集与客户字符集相同,与加载数据字符集不一致。
解决方法:强制加载数据字符集与服务器端字符集一致。
3. 服务器指定字符集与客户字符集不同,与输入数据字符集不一致。
对于这种情况,目前为止都还没有太好的解决方法。
其中有的时候可以尝试通过 iconv -f utf-8 -t gbk filename
从原字符集 utf-8 转换成 gbk
修改数据库端字符集的方法:
1.服务器端字符集的设置和修改:
1.1 创建数据库的时候直接选择正确的字符集(显示汉字的字符集主要有ZHS16CGB231280,US7ASCII,WE8ISO8859P1,ZHS16GBK等)
1.2如果创建的时候没有选择字符集,那么字符集将使用默认的字符集.可以使用如下命令查看数据库的字符集.用oracle的合法用户登录.select * from V$NLS_PARAMETERS.
SQL > select * from V$NLS_PARAMETERS
parameter value
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
…. ….
NLS_CHARACTERSET WE8ISO8859P1
NLS_SORT BINARY
NLS_NCHAR_CHARACTERSET WE8ISO8859P1
---- 从上述信息看出ORACLE 数据库的字符集为' WE8ISO8859P1'。
可以用update 命令修改数据库的字符集,但是注意:修改字符集可能会对原有数据造成破坏,修改之前一定要先备份数据库.命令如下:
用户sys 以sysdba的身份登录oracle. 字串9
SQL>update props$ set value$=’ZHS16GBK’ where name=’NLS_CHARACTERSET’
如果客户端的字符集和服务器端不相同,就必须修改字符集.否则不能正确的显示汉字.一般建议修改客户端的字符集.
1.3不同字符集数据库之间的数据导入
a)重新安装数据库或者是用update命令修改字符集。
b)强行修改oracle数据库当前字符集。以sysdba的身份登录oracle
SQL > create database character set ZHS16GBK (注:这里的字符集为导出数据的字符集)
* create database character set ZHS16GBK
ERROR at line 1:
ORA-01031: insufficient privileges
不用理会这个错误,用imp 装入数据。数据装完后,重启动oracle 数据,select * from V$NLS_PARAMETERS 此时,你会发现,数据库字符集又回到原来的字符集。
c)用第三方工具绕开字符集。如powerbuild的pipeline,delphi的datadump,MS access的数据导入导出工具。
Oracle服务器端执行
SQL> select name, value$ from sys.props$ where name like 'NLS%';
NAME VALUE$
------------------------------ ----------------------------------------
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET UTF8
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NAME VALUE$
------------------------------ ----------------------------------------
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_LENGTH_SEMANTICS BYTE
NLS_NCHAR_CONV_EXCP FALSE
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_RDBMS_VERSION 10.2.0.4.0
20 rows selected.
确认数据库创建的时候选择的字符集是 UTF-8
.执行sql :select userenv('language') from dual; 获取oracle服务端字符集X
SQL> select userenv('language') from dual;
USERENV('LANGUAGE')
----------------------------------------------------
SIMPLIFIED CHINESE_CHINA.UTF8
2. 检查执行 sqlldr 的客户端的 NLS_LANG 的设置
Oracle 客户端执行
[oracle@localhost hx]$ echo $NLS_LANG
AMERICAN_AMERICA.UTF8
3. 尽量让以上3个步骤检查出的字符集设置都一致,开始通过 sqlldr 导入文本,并检查结果。
通常出现问题的原因,可分为三种:
1. 服务器指定字符集与客户字符集不同,而与加载数据字符集一致。
解决方法:对于这种情况,只需要设置客户端字符集与服务器端字符集一致就可以了
oracle10g UTF8编码:AMERICAN_AMERICA.AL32UTF8
GBK编码:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
客户端修改为中文是:在linux的终端上设置环境变量1.LANG=zh_CN
2.NLS_LANG=zhs16gbk
2. 服务器指定字符集与客户字符集相同,与加载数据字符集不一致。
解决方法:强制加载数据字符集与服务器端字符集一致。
3. 服务器指定字符集与客户字符集不同,与输入数据字符集不一致。
对于这种情况,目前为止都还没有太好的解决方法。
其中有的时候可以尝试通过 iconv -f utf-8 -t gbk filename
从原字符集 utf-8 转换成 gbk
修改数据库端字符集的方法:
1.服务器端字符集的设置和修改:
1.1 创建数据库的时候直接选择正确的字符集(显示汉字的字符集主要有ZHS16CGB231280,US7ASCII,WE8ISO8859P1,ZHS16GBK等)
1.2如果创建的时候没有选择字符集,那么字符集将使用默认的字符集.可以使用如下命令查看数据库的字符集.用oracle的合法用户登录.select * from V$NLS_PARAMETERS.
SQL > select * from V$NLS_PARAMETERS
parameter value
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
…. ….
NLS_CHARACTERSET WE8ISO8859P1
NLS_SORT BINARY
NLS_NCHAR_CHARACTERSET WE8ISO8859P1
---- 从上述信息看出ORACLE 数据库的字符集为' WE8ISO8859P1'。
可以用update 命令修改数据库的字符集,但是注意:修改字符集可能会对原有数据造成破坏,修改之前一定要先备份数据库.命令如下:
用户sys 以sysdba的身份登录oracle. 字串9
SQL>update props$ set value$=’ZHS16GBK’ where name=’NLS_CHARACTERSET’
如果客户端的字符集和服务器端不相同,就必须修改字符集.否则不能正确的显示汉字.一般建议修改客户端的字符集.
1.3不同字符集数据库之间的数据导入
a)重新安装数据库或者是用update命令修改字符集。
b)强行修改oracle数据库当前字符集。以sysdba的身份登录oracle
SQL > create database character set ZHS16GBK (注:这里的字符集为导出数据的字符集)
* create database character set ZHS16GBK
ERROR at line 1:
ORA-01031: insufficient privileges
不用理会这个错误,用imp 装入数据。数据装完后,重启动oracle 数据,select * from V$NLS_PARAMETERS 此时,你会发现,数据库字符集又回到原来的字符集。
c)用第三方工具绕开字符集。如powerbuild的pipeline,delphi的datadump,MS access的数据导入导出工具。
相关推荐
明月清风精进不止 2020-04-15
婷婷小屋 2012-08-31
廖金龙 2019-07-01
wangcomputer00 2012-12-01
SolderSun 2017-11-20
xiaocen 2014-05-31
cshpanda 2014-04-09
sqlitexin 2012-02-17
Username -- Oracle数据库名 。Password -- Oracle数据库密码。Servicename -- 是Oracle服务实例名 。用参数控制文件中不指定数据文件更适于自动操作。
Oraclezcy 2012-02-15
Username -- Oracle数据库名 。Password -- Oracle数据库密码。Servicename -- 是Oracle服务实例名 。用参数控制文件中不指定数据文件更适于自动操作。
AC即性感 2012-01-11
SolderSun 2011-12-21
aphrodite 2011-11-09
oraclestudyroad 2011-10-10
sqlitexin 2011-05-05
Davidra 2019-04-08
love0u 2019-04-06
militala 2019-04-05