ORACLE显示中文为乱码,怎么修改?

ORACLE显示中文为乱码,怎么修改?,第1张

在Redhat上安装Oracle10g没有设定字符集,采用的是 *** 作系统默认字符集:WE8ISO8859P1,将字符集修改为:ZHS16GBK。由于过程不可逆,首先需要备份数据库。\x0d\x0a1.数据库全备\x0d\x0a\x0d\x0a2.查询当前字符集\x0d\x0aSQL>select*fromnls_database_parameterswhereparameter='NLS_CHARACTERSET'\x0d\x0aPARAMETERVALUE\x0d\x0a--------------------------------------------------------------------------------\x0d\x0aNLS_CHARACTERSETWE8ISO8859P1\x0d\x0a\x0d\x0a3.关闭数据库\x0d\x0aSQL>shutdownimmediate\x0d\x0aDatabaseclosed.\x0d\x0aDatabasedismounted.\x0d\x0aORACLEinstanceshutdown.\x0d\x0a\x0d\x0a4.启动数据库到mount状态\x0d\x0aSQL>startupmount\x0d\x0aORACLEinstancestarted.\x0d\x0aTotalSystemGlobalArea205520896bytes\x0d\x0aFixedSize1266608bytes\x0d\x0aVariableSize100666448bytes\x0d\x0aDatabaseBuffers100663296bytes\x0d\x0aRedoBuffers2924544bytes\x0d\x0aDatabasemounted.\x0d\x0a\x0d\x0a5.限制session\x0d\x0aSQL>altersystemenablerestrictedsession\x0d\x0aSystemaltered.\x0d\x0a\x0d\x0a6.查询相关参数并修改\x0d\x0aSQL>showparameterjob_queue_processes\x0d\x0aNAMETYPEVALUE\x0d\x0a-----------------------------------------------------------------------------\x0d\x0ajob_queue_processesinteger10\x0d\x0a\x0d\x0aSQL>showparameteraq_tm_processes\x0d\x0aNAMETYPEVALUE\x0d\x0a-----------------------------------------------------------------------------\x0d\x0aaq_tm_processesinteger0\x0d\x0a\x0d\x0aSQL>altersystemsetjob_queue_processes=0\x0d\x0aSystemaltered.\x0d\x0a\x0d\x0a7.打开数据库\x0d\x0aSQL>alterdatabaseopen\x0d\x0aDatabasealtered.\x0d\x0a\x0d\x0a8.修改字符集\x0d\x0aSQL>alterdatabasecharactersetZHS16GBK\x0d\x0aalterdatabasecharactersetZHS16GBK\x0d\x0a*\x0d\x0aERRORatline1:\x0d\x0aORA-12712:newcharactersetmustbeasupersetofoldcharacterset\x0d\x0a\x0d\x0a出现错误提示,新字符集必须是老字符集的超集,也就原来字符集是新字符集的子集,可以再Oracle官方文档上查询字符集包含关系。下面使用Oracle内部命令internal_use,跳过超集检查,生产环境不建议使用此方法。\x0d\x0a\x0d\x0aSQL>alterdatabasecharactersetinternal_useZHS16GBK\x0d\x0aDatabasealtered.\x0d\x0a\x0d\x0a9.查询当前字符集\x0d\x0aSQL>select*fromnls_database_parameterswhereparameter='NLS_CHARACTERSET'\x0d\x0aPARAMETERVALUE\x0d\x0a--------------------------------------------------------------------------------\x0d\x0aNLS_CHARACTERSETZHS16GBK\x0d\x0a\x0d\x0a10.关闭数据库\x0d\x0aSQL>shutdownimmediate\x0d\x0aDatabaseclosed.\x0d\x0aDatabasedismounted.\x0d\x0aORACLEinstanceshutdown.\x0d\x0a\x0d\x0a11.启动数据库到mount状态\x0d\x0aSQL>startupmount\x0d\x0aORACLEinstancestarted.\x0d\x0aTotalSystemGlobalArea205520896bytes\x0d\x0aFixedSize1266608bytes\x0d\x0aVariableSize100666448bytes\x0d\x0aDatabaseBuffers100663296bytes\x0d\x0aRedoBuffers2924544bytes\x0d\x0aDatabasemounted.\x0d\x0a\x0d\x0a12.将相关参数改回原来值\x0d\x0aSQL>altersystemsetjob_queue_processes=10\x0d\x0aSystemaltered.\x0d\x0a\x0d\x0a13.打开数据库\x0d\x0aSQL>alterdatabaseopen\x0d\x0aDatabasealtered.

1. 服务器指定字符集与客户字符集不同,而与加载数据字符集一致。

解决方法:对于这种情况,只需要设置客户端字符集与服务器端字符集一致就可以了,具体 *** 作如下:

* 查看当前字符集:

SQL>select * from sys.props$

2 WHERE NAME=‘NLS_CHARACTERSET’

NAME value$

NLS_CHARACTERSET ZHS16GBK

可以看出,现在服务器端Oracle数据库的字符集为‘ZHS16GBK’

* 根据服务器的字符集在客户端作相应的配置或者安装Oracle的客户端软件时指定:

如果还没安装客户端,那么在安装客户端时,指定与服务器相吻合的字符集即可;如果已经安装好了客户端,并且客户端为 sql*net 2.0 以下版本,进入Windows的系统目录,编辑oracle.ini文件,用US7ASCII替换原字符集,重新启动计算机,设置生效;否则,如果,客户端为 sql*net 2.0 以上版本,在Win98 下 运 行REGEDIT,第一步选HKEY_LOCAL_MACHINE,第二步选择SOFTWARE, 第三步选择 Oracle, 第四步选择 NLS_LANG, 键 入 与服 务 器 端 相 同 的 字 符 集

(本例为:HKEY_LOCAL_MACHINE/

SOFTWARE/ORACLE/NLS_LANG :AMERICAN _ AMERICA. ZHS16GBK)。

如果是UNIX客户端,则:

SQL>conn / as sysdba

Connected.

SQL>SQL>UPDATE sys.PROPS$ SET value$=‘SIMPLIFIED CHINESE’

2 WHERE NAME=‘NLS_LANGUAGE’

2. 服务器指定字符集与客户字符集相同,与加载数据字符集不一致。

解决方法:强制加载数据字符集与服务器端字符集一致。要做到这一点,可以通过重新创建数据库,并选择与原卸出数据一致的字符集,然后IMP数据,这种情况仅仅适用于空库和具有同一种字符集的数据。

解决这类问题,也可以先将数据加载到具有相同字符集的服务器上,然后用转换工具卸出为foxbase 格式或access格式数据库,再用转换工具转入到不同字符集的Oracle数据库中,这样就避免了Oracle字符集的困扰。目前数据库格式转换的工具很多,像power builder5.0以上版本提供的pipeline及Microsoft Access数据库提供的数据导入/导出功能等。

3. 服务器指定字符集与客户字符集不同,与输入数据字符集不一致。

对于这种情况,目前为止都还没有太好的解决方法。

通过上面的了解,我们知道,导致在后期使用数据库时出现种种关于字符集的问题,多半是由于在数据库设计、安装之初没有很好地考虑到以后的需要,所以,我们完全可以通过在服务器上和客户端使用相同的字符集来避免由此类问题引出的麻烦

怎样修改查看Oracle字符集

a.数据库服务器字符集select * from nls_database_parameters,其来源于props$,是表示数据库的字符集。

b.客户端字符集环境select * from nls_instance_parameters,其来源于v$parameter,

表示客户端的字符集的设置,可能是参数文件,环境变量或者是注册表

c.会话字符集环境 select * from nls_session_parameters,其来源于v$nls_parameters,表示会话自己的设置,可能是会话的环境变量或者是alter session完成,如果会话没有特殊的设置,将与nls_instance_parameters一致。

客户端的字符集要求与服务器一致,才能正确显示数据库的非Ascii字符。如果多个设置存在的时候,alter session>环境变量>注册表>参数文件

实际情况

我用select * from nls_database_parameters

PARAMETER VALUE

------------------------------ ------------------------------

NLS_LANGUAGE AMERICAN

NLS_TERRITORY AMERICA

NLS_CURRENCY $

NLS_ISO_CURRENCY AMERICA

NLS_NUMERIC_CHARACTERS .,

NLS_CHARACTERSET ZHS16GBK

NLS_CALENDAR GREGORIAN

NLS_DATE_FORMATDD-MON-RR

NLS_DATE_LANGUAGE AMERICAN

NLS_SORT BINARY

NLS_TIME_FORMATHH.MI.SSXFF AM

PARAMETER VALUE

------------------------------ ------------------------------

NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMATDD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY $

NLS_COMP BINARY

NLS_LENGTH_SEMANTICS BYTE

NLS_NCHAR_CONV_EXCPFALSE

NLS_NCHAR_CHARACTERSET AL16UTF16

NLS_RDBMS_VERSION 10.2.0.1.0

说明我在创建数据库时指定的字符集是ZHS16GBK,我用

update sys.props$ set value$='AL32UTF8' where name='NLS_CHARACTERSET'

修改了字符集,但插入中文时仍然有问题,这或许就如上面资料所说的通过修改SYS.PROPS$来修改主要是对应客户端的显示,与存储无关,

所以仍旧是乱码。

然后我重新创建了个数据库,指定字符集为AL32UTF8,插入中文就没问题了。

可见我们如果要在数据库中显示中文,在创建数据库时一定哟指定好所用的字符集。

一、pl/sql developer 中文字段显示乱码

原因:因为数据库的编号格式和pl /sql developer的编码格式不统一造成的。

二、查看和修改oracle数据库字符集:

select userenv('language') from dual

查询结果:

SIMPLIFIED CHINESE_CHINA.AL32UTF8

--修改oracle数据库字符集:(在SQL Plus中)

sql>conn / as sysdba

sql>shutdown immediate

database closed.

database dismounted.

oracle instance shut down.

sql>startup mount

oracle instance started.

total system global area 135337420 bytes

fixed size 452044 bytes

variable size 109051904 bytes

database buffers 25165824 bytes

redo buffers 667648 bytes

database mounted.

sql>alter system enable restricted session

system altered.

sql>alter system set job_queue_processes=0


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9894184.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-03
下一篇2023-05-03

发表评论

登录后才能评论

评论列表(0条)

    保存