日期:2014-05-17 浏览次数:21113 次
一直知道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();
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'中文测试')