社区
MS-SQL Server
帖子详情
ORACLE字符集的修改
chengqi
2000-08-25 05:03:00
为什么检索出来的中文都是乱字符(我已经将注册表中NLS_LANG键改为AMERICAN_AMERICA.US7ASICC)
...全文
506
7
打赏
收藏
ORACLE字符集的修改
为什么检索出来的中文都是乱字符(我已经将注册表中NLS_LANG键改为AMERICAN_AMERICA.US7ASICC)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lipingcool
2001-02-26
打赏
举报
回复
转贴一篇文章:
影响ORACLE汉字显示的字符集问题
中原油田研究院
康子明 等4人
---- 在国内外大中型数据库管理系统中,把ORACLE作为数据库管理平台的用户比较多。ORACLE 不论是数据库管理能力还是安全性都是无可非议的,但是,它在汉字信息的显示方面着实给中国用户带来不少麻烦,笔者多年从事ORACLE数据库管理,经常收到周围用户和外地用户反映有关ORACLE数据库汉字显示问题的求援信,主要现象是把汉字显示为不可识别的乱码,造成原来大量信息无法使用。本文将就这一问题产生的原因和解决办法进行一些探讨,供存在这方面问题的用户朋友参考。
---- 1、原因分析
---- 通过对用户反映情况的分析,发现字符集的设置不当是影响ORACLE数据库汉字显示的关键问题。那么字符集是怎么一会事呢?字符集是ORACLE 为适应不同语言文字显示而设定的。用于汉字显示的字符集主要有ZHS16CGB231280,US7ASCII,WE8ISO8859P1等。字符集不仅需在服务器端存在,而且客户端也必须有字符集注册。服务器端,字符集是在安装ORACLE时指定的,字符集登记信息存储在ORACLE数据库字典的V$NLS_PARAMETERS表中;客户端,字符集分两种情况,一种情况是sql*net 2.0以下版本,字符集是在windows的系统目录下的oracle.ini文件中登记的;另一种情况是sql*net 2.0以上(即32位)版本,字符集是在windows的系统注册表中登记的。要在客户端正确显示ORACLE 数据库汉字信息,首先必须使服务器端的字符集与客户端的字符集一致;其次是加载到ORACLE数据库的数据字符集必须与服务器指定字符集一致。因此,把用户存在的问题归纳分类,产生汉字显示异常的原因大致有以下几种:
---- 1. 1服务器指定字符集与客户字符集不同,而与加载数据字符集一致。
---- 这种情况是最常见的,只要把客户端的字符集设置正确即可,解决办法见2.1。
---- 1. 2服务器指定字符集与客户字符集相同,与加载数据字符集不一致。
---- 这类问题一般发生在ORACLE版本升级或重新安装系统时选择了与原来服务器端不同的字符集,而恢复加载的备份数据仍是按原字符集卸出的场合,以及加载从其它使用不同字符集的ORACLE数据库卸出的数据的情况。这两种情况中,不管服务器端和客户端字符集是否一致都无法显示汉字。解决办法见2.2。
---- 1.3服务器指定字符集与客户字符集不同,与输入数据字符集不一致。
---- 这种情况是在客户端与服务器端字符集不一致时,从客户端输入了汉字信息。输入的这些信息即便是把客户端字符集更改正确,也无法显示汉字。解决办法见2.3。
---- 2.解决办法
---- 下面将分别对上述三种情况给出解决办法。为了叙述方便,假设客户端使用WINDOWS95/98环境,并已成功地配置了TCP/IP协议,安装了ORACLE的sql*net,sql*pluse产品。
---- 2.1 设置客户端字符集与服务器端字符集一致
---- 假设当前服务器端使用US7ASCII字符集。
---- (1)查看服务器端字符集
---- 通过客户端或服务器端的sql*plus登录ORACLE的一个合法用户,执行下列SQL语句:
SQL > select * from V$NLS_PARAMETERS
parameter value
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
…. ….
NLS_CHARACTERSET US7ASCII
NLS_SORT BINARY
NLS_NCHAR_CHARACTERSET US7ASCII
---- 从上述列表信息中可看出服务器端ORACLE数据库的字符集为'US7ASCII'。
---- (2)按照服务器端字符集对客户端进行配置
---- 配置方法有两种:
安装ORACLE的客户端软件时指定
---- 在安装ORACLE的客户端产品软件时,选择与ORACLE服务端一致的字符集(本例为US7ASCII)即可。
修改注册信息的方法
---- 根据ORACLE 客户端所选sql*net 的版本分为下列两种情况:
---- a. 客户端为 sql*net 2.0 以下版本
---- 进入Windows的系统目录,编辑oracle.ini文件,用US7ASCII替换原字符集,重新启动计算机,设置生效。
---- b. 客户端为 sql*net 2.0 以上版本
---- 在WIN98 下 运 行REGEDIT,第一步选HKEY_LOCAL_MACHINE,第二步选择SOFTWARE, 第三步选择 ORACLE, 第四步选择 NLS_LANG, 键 入 与服 务 器 端 相 同 的 字 符 集(本例为:AMERICAN_AMERICAN.US7ASCII)。
---- 2.2 强制加载数据字符集与服务器端字符集一致
---- 假设要加载数据从原ORACLE数据库卸出时的字符集为US7ASCII,当前ORACLE服务器字符集为WE8ISO8859P1。
---- 下面提供三种解决方法:
---- (1) 服务器端重新安装ORACLE
---- 在重新安装ORACLE 时选择与原卸出数据一致的字符集(本例为US7ASCII)。
---- 加载原卸出的数据。
---- 这种情况仅仅使用于空库和具有同一种字符集的数据。
---- (2)强行修改服务器端ORACLE当前字符集
---- 在用imp命令加载数据前,先在客户端用sql*plus登录system DBA用户,执行下列SQL语句进行当前ORACLE数据库字符集修改:
SQL > create database character set US7ASCII
* create database character set US7ASCII
ERROR at line 1:
ORA-01031: insufficient privileges
---- 你会发现语句执行过程中,出现上述错误提示信息,此时不用理会,实际上ORACLE数据库的字符集已被强行修改为US7ASCII,接着用imp命令装载数据。等数据装载完成以后,shutdown 数据库,再startup 数据库,用合法用户登录ORACLE数据库,在sql>命令提示符下,运行select * from V$NLS_PARAMETERS,可以看到ORACLE数据库字符集已复原,这时再查看有汉字字符数据的表时,汉字已能被正确显示。
---- (3)利用数据格式转储,避开字符集限制
---- 这种方法主要用于加载外来ORACLE数据库的不同字符集数据。其方法如下:
---- 先将数据加载到具有相同字符集的服务器上,然后用转换工具卸出为foxbase 格式或access格式数据库,再用转换工具转入到不同字符集的ORACLE数据库中,这样就避免了ORACLE字符集的困扰。目前数据库格式转换的工具很多,象power builder5.0以上版本提供的pipeline,Microsoft Access数据库提供的数据导入/导出功能等。转换方法参见有关资料说明。.
---- 2.3匹配字符集替换汉字
---- 对于1.3提到的情况,没有很好的办法,只能先把客户端与服务器端字符集匹配一致后,根据原输入汉字的特征码替换汉字字符部分。
lynx
2000-09-05
打赏
举报
回复
如果要在使原数据库中数据保持不变的前提下改变字符集,可以参考以下方法:
1)关闭Oracle,物理备份Oracle系统。
2)启动Oracle, 修改sys的表props$,把name='NLS_CHARACTERSET'行的values$设置为新的字符集。例如
update props$ set value$='ZHS16CGB231280' where name='NLS_CHARACTERSET';
3)设置环境变量NLS_LANG。例如
NLS_LANG =AMERICAN_AMERICA. ZHS16CGB231280
4)用EXP做全部数据库备份。
5)关闭Oracle。
6)重新创建数据库。
7)用IMP做全部数据库恢复。
8)如果由于各种原因不成功,可以使用第一步的物理备份恢复原始数据库。:)
Tommy Chang
2000-08-29
打赏
举报
回复
数据库建的时候指定的是哪个字符集?可以保证数据库已有的数据里,中文没问题?
然后再看client的配置。
9Thoughts中server字符集也是指数据库建库的字符集吧?
:)
9Thoughts
2000-08-27
打赏
举报
回复
重要的是Server和Client字符集一致,而不是使用那个字符集。
alexela
2000-08-26
打赏
举报
回复
应该是AMERICAN_AMERICA.US7ASCII,只要保证SERVER和CLIENT都是同样的字符集即可。我用的就是AMERICAN_AMERICA.US7ASCII,中文性能很好,绝对正确
mnbvcxz
2000-08-26
打赏
举报
回复
是AMERICAN_AMERICA.US7ASCII,中文的一般都用
CHINA_SIMPLIFIED CHINESE.ZHS16CGB231280,记不情了,也有可能是
SIMPLIFIED CHINESE_CHINA.ZHS16CGB231280
Fxx
2000-08-25
打赏
举报
回复
如果数据是自己输入的而不是倒进去的,可能是因为操作系统的字符集
与数据库的字符集不匹配的原因,试一下吧。
oracle
字符集
修改
命令
oracle
字符集
修改
命令
oracle
字符集
修改
命令
oracle
字符集
修改
命令
oracle
字符集
修改
命令
Oracle
修改
字符集
Oracle
修改
字符集
Oracle
修改
字符集
Oracle
修改
字符集
oracle
字符集
的查看和client
字符集
的
修改
oracle
字符集
的查看,
oracle
客户端
字符集
的
修改
oracle
字符集
修改
oracle
字符集
修改
经验积累与步骤描述。
oracle
修改
字符集
oracle
11g
修改
字符集
修改
为ZHS16GBK 有时候因为数据库的
字符集
的问题,导致dmp文件不能正常导入到其他数据库。可以用下面的方法将数据库的
字符集
修改
一下
MS-SQL Server
34,591
社区成员
254,589
社区内容
发帖
与我相关
我的任务
MS-SQL Server
MS-SQL Server相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章