从Oracle9204的AL32UTF8字符集到Oracle8.x的US7ASCII写入汉字乱码问题
[font=楷体_GB2312][size=20px][b]一、数据接口功能简要说明[/b][/size][/font][font=楷体_GB2312][size=20px] 数据接口是主要完成在项目数据采集系统单轨运行以后,将项目PCEDM数据库中的数据迁移到甲方现有的PDPMIS数据库中,以满足部分下属单位的特殊应用对数据的需求,避免基层数据采集的重复录入工作。数据接口主要工作包括以下几个方面:[/size][/font]
[font=楷体_GB2312][size=20px]1.PDPMIS所需数据的需求确定;[/size][/font]
[font=楷体_GB2312][size=20px]2.PDPMIS与现有PCEDM模型的数据字典的映射;[/size][/font]
[font=楷体_GB2312][size=20px]3.从PCEDM数据库中读取数据;[/size][/font]
[font=楷体_GB2312][size=20px]4.按照映射关系将数据写入PDPMIS数据库;[/size][/font]
[font=楷体_GB2312][size=20px]5.并在写入之后,对代码进行必要的替换;[/size][/font]
[font=楷体_GB2312][size=20px][/size][/font]
[font=楷体_GB2312][size=20px][b]二、问题描述[/b][/size][/font]
[font=楷体_GB2312][size=20px]在数据接口软件开发过程中,我们发现甲方现有数据库版本全部为Oracle 8.X,并且全部采用US7ASCII字符集来存储数据(包括汉字),而A2项目的PCEDM模型数据库采用的Oracle 9.2.04字符集统一全部是AL32UTF8字符集。当我们开发WEB的数据接口程序,把数据从PCEDM数据库提取出来以后,写入PDPMIS数据中的时候,由于字符集不同汉字全部变成了乱码。[/size][/font]
[align=center]?/P>[/align]
[font=楷体_GB2312][size=20px][b]三、问题分析[/b][/size][/font]
[font=楷体_GB2312][size=20px] 经过互联网上查找大量的文章,对问题有了相对全面的了解。[/size][/font]
[font=楷体_GB2312][size=20px] 首先,PDPMIS所采用的字符集US7ASCII实质上是英文ASCII码的字符集,并不适合于存储汉字。存在这一历史遗留问题是因为油田在很早就使用的Oracle数据库,而Oracle7以前的版本并不支持汉字存储。[/size][/font]
[font=楷体_GB2312][size=20px]其次,当Oracle客户端和服务器的字符集为同一字符集时,读写数据库时数据库检测客户端与服务器为同一字符集时,就不对所存数据不做任何字符集的转换直接存储到服务器。甲方的相关应用正是利用这一点实现了Oracle数据库在US7ASCII字符集下存储汉字不发生乱码。这一点为我们最终顺利解决这一问题提供了很重要的解决思路。[/size][/font]
[font=楷体_GB2312][size=20px][/size][/font]
[font=楷体_GB2312][size=20px]四、实验环境[/size][/font]
[font=楷体_GB2312][size=20px](一)开发机器环境[/size][/font]
[font=楷体_GB2312][size=20px]1.操作系统:Windows XP Professional[/size][/font]
[font=楷体_GB2312][size=20px]2.开发工具:Visual Studio 2003 C#语言开发WEB应用程序[/size][/font]
[font=楷体_GB2312][size=20px]3.数据库客户端:Oracle 9.2.0.1 f[/size][/font]
[font=楷体_GB2312][size=20px](二)源数据库服务器[/size][/font]
[font=楷体_GB2312][size=20px]1.操作系统:Sun Solaris 9 Sparc 64[/size][/font]
[font=楷体_GB2312][size=20px]2.数据库:Oracle 9.2.04[/size][/font]
[font=楷体_GB2312][size=20px]3.数据库字符集:AL32UTF8[/size][/font]
[font=楷体_GB2312][size=20px](三)目标数据库服务器[/size][/font]
[font=楷体_GB2312][size=20px]1.操作系统:Sun Solaris 8或更低[/size][/font]
[font=楷体_GB2312][size=20px]2.数据库:Oracle 8.X[/size][/font]
[font=楷体_GB2312][size=20px]3.数据库字符集:US7ASCII[/size][/font]
[font=楷体_GB2312][size=20px](四)辽河A2TWS服务器[/size][/font]
[font=楷体_GB2312][size=20px]1.操作系统:Windows 2003 Enterprise Edition(English)[/size][/font]
[font=楷体_GB2312][size=20px]2.客户端:Oracle 9.2.0.1 for Windows Client[/size][/font]
[font=楷体_GB2312][size=20px][b]五、解决办法[/b][/size][/font]
[font=楷体_GB2312][size=20px] 在分别利用VS.NET 2003/2005开发WEB应用、CS应用、PowerBuilder,并变换不同的数据库连接方式和驱动程序类型之后,得到一套成熟的解决办法。现与大家分享如下:[/size][/font]
[font=楷体_GB2312][size=20px]1.必须将软件开发机器客户端的注册表中的HEY_LOCAL _MACHINE->Software ->Oracle->OracleHome->NLS_LANG,设置为‘US7ASCII’。当客户端和服务器是同一字符集时,Oracle数据库客户端在读写数据时,不做任何处理。[/size][/font]
[font=楷体_GB2312][size=20px][/size][/font]
[font=楷体_GB2312][size=20px]2.经过大量试验,在利用C#写入目标数据库时必须采用Microsoft for Oracle 的ODBC驱动程序。以下是连接数据库的源代码:[/size][/font]
[font=楷体_GB2312][size=20px]Driver={Microsoft ODBC for Oracle};Server=sgcyc; Uid=edmadmin;Pwd=edmadmin;[/size][/font]
[font=楷体_GB2312][size=20px][/size][/font]
[font=楷体_GB2312][size=20px]3.系统部署:我们将开发的WEB程序,在不同的操作系统上进行了大量的试验,包括:Windows 2003英文标准版、企业版\Windows2003中文标准版、企业版\Windows XP 中文Professional。最终只有Windows XP中文版上面能够部署成功。[/size][/font]
[font=楷体_GB2312][size=20px] 由于甲方的服务器目前全部是Windows2003,且Windows XP不能安装在服务器上.目前,采取的解决方案是在服务器的Windows 2003的英文版上安装VMWare Workstation6.0软件,然后在此虚拟机上安装XP操作系统,并给虚拟机里的XP操作系统分配一个固定IP(设置与主服务器完全相同)与主服务器采用“Bridged”模式。[/size][/font]
页:
[1]