2 mawang1024 mawang1024 于 2016.03.09 09:33 提问

asp.net 向 Oracle 添加数据 中文乱码 10C

问题:asp.net 向oracle 插入中文乱码 oracle 字符集 AMERICAN_AMERICA.US7ASCII 而oracle的字符集是不可更改的。那么在程序如何处理?

2个回答

Marksinoberg
Marksinoberg   Ds   Rxr 2016.03.09 10:08

出现乱码的原因无非也就那么几个,要么代码的编码和数据库的不统一,要么从数据库获取数据的时候采取的编码出错,要么就是界面展示数据的时候出错了!不妨从这几个方面着手进行修改,希望对你有用图片说明

qq_32969313
qq_32969313   2016.03.09 16:28

搜到两个看起来靠谱的方法
1.
以上的大伙们不要乱发言好不好,根本不是你们说的那样,那只是字体问题,具体解决你可以到注册表的以下键目录下修改就可以:
Oracle-->home0-->nls_lang
将它的AMERICAN_AMERICA.US7ASCII
修改成SIMPLIFIED CHINESE_CHINA.ZHS16GBK
就行了,记得将软件重新启一下
一定行的,记的给我加分哦

2.==============================================================================

oracle8.05字符集US7ASCII-->Oracle8.17字符集ZHS16GBK字符集的数据exp,imp问题

查看oracle8.05历史数据字符集合参数

column VALUE format a20
select parameter,value from v$nls_parameters;
PARAMETER VALUE


NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-YY
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET US7ASCII
NLS_SORT BINARY

NLS_NCHAR_CHARACTERSET US7ASCII

在softing上新建数据库oracle 8.05字符集均为us7ascii,us7ascii

例子: B3C2BFCBB8D5陈克刚 是标准的国家标准 如果去掉高位33423f4b3855

connect system/manager@rube;
select name,value$ from sys.props$;
NAME VALUE$


DICT.BASE 2
NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-YY
NLS_DATE_LANGUAGE AMERICAN
NLS_CHARACTERSET US7ASCII
NLS_SORT BINARY
NLS_NCHAR_CHARACTERSET US7ASCII
NLS_RDBMS_VERSION 8.0.5.0.0
GLOBAL_DB_NAME RUBE.WORLD

EXPORT_VIEWS_VERSION 7

首先处理使US7ASCII能够支持中文,修改数据库客户端字符集

update sys.props$ set value$='WE8ISO8859P1' where name like 'NLS_CHARACTERSET';
update sys.props$ set value$='WE8ISO8859P1' where name like 'NLS_NCHAR_CHARACTERSET';
commit;

svrmgr30
connect internal/oracle@rube
shutdown imeediate
startup

这样在修改数据库客户端字符集为WE8ISO8859P1,数据库字符集us7acii插入汉字和显示汉字均正常

然后使用exp80导出oracle8.05下用户的表到文件user.dmp,查看oracle字符集和编码
31 =001F WE8ISO8859P1 查看user.dmp第2,3字节为 001F = 31

852 =0354 ZHS16GBK

select nls_charset_id('WE8ISO8859P1') from dual;

select nls_charset_name(31) from dual;

select nls_charset_id('US7ASCII') from dual;

select nls_charset_id('ZHS16GBK') from dual;

使用二进制工具修改文件user.dmp的第二,三字节为oracle817的字符集编码0354
在使用oracle817导入User.dmp文件导入以后,原来在oracle805(us7ascii)下显示的数据库
在oracle817(ZHS16GBK)显示和插入正常
能正确导入的原因:oracle805在配置客户端字符集合,能正常显示和插入汉字的情况下,exp
导出的汉字均为国家标准编码(可即区位码),在orcle817中只要将oracle805
Exp文件字符集WE8ISO8859P1的ID改为oracle817的字符集ZHS16GBK的ID,

在用oracle的imp工具导入既能正常导入.

以下是错误的修改

update sys.props$ set value$='US7ASCII' where name like 'NLS_CHARACTERSET';
update sys.props$ set value$='US7ASCII' where name like 'NLS_NCHAR_CHARACTERSET';
commit;
svrmgr30
connect internal/oracle@rube
shutdown imeediate
startup

在插入和显示汉字不正常,是因为WE8ISO8859P1是US7ASCII的超集,超集不能改为子集

update sys.props$ set value$='ZHS16CGB231280' where name like 'NLS_CHARACTERSET';
update sys.props$ set value$='ZHS16CGB231280' where name like 'NLS_NCHAR_CHARACTERSET';
commit;
svrmgr30
connect internal/oracle@rube
shutdown imeediate
startup

在插入和显示汉字不正常,是因为ZHS16CGB231280和US7ASCII是不同的集合,不能转换

没有环境,你测试下,看是否可用

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!