oracle 导入 mysql 乱码_sqlldr 导入乱码 Oracle客户端字符集问题

本文详细介绍了如何检查Oracle数据库的字符集,包括通过SQL查询服务器和客户端的字符集设置。强调了在数据导入时,服务器、客户端及数据文件字符集保持一致的重要性,以及不一致时的解决策略。还提到了修改数据库字符集的方法和风险,并提供了第三方工具绕过字符集问题的方案。
摘要由CSDN通过智能技术生成

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

logo.gif

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值