日期:2014-05-17  浏览次数:21039 次

c#对使用US7ASCII的oracle存取中文的问题

一直知道oracle有字符集的问题,但以前安装oralce基本都直接选择了gbk的字符集,所以没碰到过问题,直到这次遇到一个客户坚持要求使用us7ascii的字符集,才被折腾了一番。


基本环境如下:

数据库服务器:windows 2003 sp2中文版 + oracle 10g (us7ascii)

应用服务器:iis7 + .net 3.5

问题如下:

1。无法正常存取中文,数据库字段设置为nvarchar也不行。

解决方法:采用指定参数类型的方式可解决(前提:数据库和客户端的字符集必须一直,客户端操作系统可不同)

            OracleConnection con = new OracleConnection(conString);
            con.Open();

            OracleCommand cmd = con.CreateCommand();
            cmd.CommandText = "insert into test values(6,:vc,:nvc)";
            OracleParameter p1 = new OracleParameter("vc", OracleType.VarChar);
            OracleParameter p2 = new OracleParameter("nvc", OracleType.NVarChar);
            p1.Value = "中";
            p2.Value = "中";
            cmd.Parameters.Add(p1);
            cmd.Parameters.Add(p2);
            cmd.ExecuteNonQuery();

上述代码中,nvc的中 可以正常显示,当然数据库中字段必须为nvarchar

2。某些不方便指定参数类型的情况下:

            System.Environment.SetEnvironmentVariable("ORA_NCHAR_LITERAL_REPLACE", "TRUE");
            conString = "...";
            OracleConnection con = new OracleConnection(conString);  
            con.Open();
            OracleCommand cmd = con.CreateCommand();
            cmd.CommandText = "insert into test values(3,N'中文测试',N'中文测试')";
            cmd.ExecuteScalar();
奥妙就在第一句

    System.Environment.SetEnvironmentVariable("ORA_NCHAR_LITERAL_REPLACE", "TRUE");       

这句代码设置了环境变量:ORA_NCHAR_LITERAL_REPLACE的值,此值得默认值为false,表示任何从客户端传过来的NCHAR类型的字符先转换为数据库字符集,再转换为国家数据库字符集,而把该参数设为true后,从客户端传过来的NCHAR类型的字符直接转换为国家字符集存储,因此要想正确存储NCHAR字符集,必须得把该参数设为TRUE。

3。Oracle SQL Developer中如何插入中文

找到{ORACLE_HOME}\sqldeveloper\sqldeveloper\bin\sqldeveloper.conf(依赖于你的Oracle SQL Developer安装路径),添加一行配置:

AddVMOption -Doracle.jdbc.convertNcharLiterals=true

同时在中文字符串前添加“N”前缀:

insert into test values(3,N'中文测试',N'中文测试')