Home > Database > Mysql Tutorial > body text

sqlldr 导入乱码 Oracle客户端字符集问题

WBOY
Release: 2016-06-07 17:08:33
Original
1680 people have browsed it

1,查Oracle数据库创建时候的字符集:Oracle服务器端执行SQLgt; select name, value$ from sys.props$ where name like

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

      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的数据导入导出工具。

linux

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!