Oracle不同字符集中对VarChar2和NVarChar2插入它国语言测试

今天测试了一下,今天在这里不知写什么就贴了出来,测试环境:

Oracle数据库1:中文操作系统,Oracle10g,字符集编码为 ZHS16BGK

Oracle数据库2:中文操作系统,Oracle10g,字符集编码为 ALT32UTF8

客户端:WinXP中文操作系统。 

测试过程用代码说话:

        // Oracle数据库1
        //
哪种插入方式下,中文部分都正常
        private void button3_Click(object sender, EventArgs e) {
            using (OracleConnection conn = new OracleConnection()) {
                conn.ConnectionString = "Data source=serverdb;User ID=dbuser;Pwd=238173";
                conn.Open();
                OracleCommand cmd = new OracleCommand();
                cmd.Connection = conn;
                //
删除表
                try {
                    cmd.CommandText = "DROP TABLE A001";
                    cmd.ExecuteNonQuery();
                }
                catch {
                    //
可能不存在
                } 

                // 创建表
                cmd.CommandText = "CREATE TABLE A001(ID NUMBER(1), NAME VARCHAR2(100), NAME2 NVARCHAR2(100))";
                cmd.ExecuteNonQuery(); 

                // 方式一插入数据
                cmd.CommandText = "INSERT INTO A001 VALUES(1, N'
中国고려대학교上海', N'中国고려대학교上海')";
                cmd.ExecuteNonQuery(); 

                // 方式二插入数据
                cmd.CommandText = "INSERT INTO A001 VALUES(2, :NAME, :NAME2)";
                cmd.Parameters.Add("NAME", OracleType.VarChar);
                cmd.Parameters.Add("NAME2", OracleType.NVarChar);
                cmd.Parameters[0].Value = "
中国고려대학교上海"; // 包含有它国语言
                cmd.Parameters[1].Value = "
中国고려대학교上海";
                cmd.ExecuteNonQuery();
                cmd.Parameters.Clear(); 

                object name;
                object name2;
                //
用数据适配器获取数据
                cmd.CommandText = "SELECT NAME, NAME2 FROM A001";
                OracleDataAdapter da = new OracleDataAdapter(cmd);
                DataTable table = new DataTable();
                da.Fill(table);
                foreach (DataRow row in table.Rows) {
                    name = row["NAME"];   //
二种方式插入的数据,它国语言部分都显示为乱码
                    name2 = row["NAME2"]; //
用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
                }
                cmd.Parameters.Clear(); 

                // ExecuteScalar 获取数据
                cmd.CommandText = "SELECT NAME FROM A001 WHERE ID = 1";
                name = cmd.ExecuteScalar(); //
它国语言部分显示为乱码

                cmd.CommandText = "SELECT NAME2 FROM A001 WHERE ID = 1";
                name2 = cmd.ExecuteScalar(); //
它国语言部分显示为乱码

                cmd.CommandText = "SELECT NAME FROM A001 WHERE ID = 2";
                name = cmd.ExecuteScalar(); //
它国语言部分显示为乱码

                cmd.CommandText = "SELECT NAME2 FROM A001 WHERE ID = 2";
                name2 = cmd.ExecuteScalar(); //
它国语言部分显示正常

                // ExecuteReader 获取数据
                cmd.CommandText = "SELECT NAME, NAME2 FROM A001";
                OracleDataReader reader = cmd.ExecuteReader();
                while (reader.Read()) {
                    name = reader.GetValue(0);  //
二种方式插入的数据,它国语言部分都显示为乱码
                    name2 = reader.GetValue(1); //
用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
                }
            }
        } 

        //Oracle数据库2
        //
哪种插入方式下,中文部分都正常
        private void button4_Click(object sender, EventArgs e) {
            using (OracleConnection conn = new OracleConnection()) {
                conn.ConnectionString = "Data source=testdb;User ID=dbuser;Pwd=dcms";
                conn.Open();
                OracleCommand cmd = new OracleCommand();
                cmd.Connection = conn; 

                // 删除表
                try {
                    cmd.CommandText = "DROP TABLE A001";
                    cmd.ExecuteNonQuery();
                }
                catch {
                    //
可能不存在
                } 

                // 创建表
                cmd.CommandText = "CREATE TABLE A001(ID NUMBER(1), NAME VARCHAR2(100), NAME2 NVARCHAR2(100))";
                cmd.ExecuteNonQuery(); 

                // 方式一插入数据
                cmd.CommandText = "INSERT INTO A001 VALUES(1, N'
中国고려대학교上海', N'中国고려대학교上海')";
                cmd.ExecuteNonQuery(); 

                // 方式二插入数据
                cmd.CommandText = "INSERT INTO A001 VALUES(2, :NAME, :NAME2)";
                cmd.Parameters.Add("NAME", OracleType.VarChar);
                cmd.Parameters.Add("NAME2", OracleType.NVarChar);
                cmd.Parameters[0].Value = "
中国고려대학교上海"; // 有它国语言
                cmd.Parameters[1].Value = "
中国고려대학교上海";
                cmd.ExecuteNonQuery();
                cmd.Parameters.Clear(); 

                object name;
                object name2;
                //
用数据适配器获取数据
                cmd.CommandText = "SELECT NAME, NAME2 FROM A001";
                OracleDataAdapter da = new OracleDataAdapter(cmd);
                DataTable table = new DataTable();
                da.Fill(table);
                foreach (DataRow row in table.Rows) {
                    name = row["NAME"];   //
用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
                    name2 = row["NAME2"]; //
用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
                }
                cmd.Parameters.Clear();
                //
ExecuteScalar 获取数据
                cmd.CommandText = "SELECT NAME FROM A001 WHERE ID = 1";
                name = cmd.ExecuteScalar(); //
它国语言部分显示为乱码

                cmd.CommandText = "SELECT NAME2 FROM A001 WHERE ID = 1";
                name2 = cmd.ExecuteScalar(); //
它国语言部分显示为乱码

                cmd.CommandText = "SELECT NAME FROM A001 WHERE ID = 2";
                name = cmd.ExecuteScalar(); //
它国语言部分显示正常

                cmd.CommandText = "SELECT NAME2 FROM A001 WHERE ID = 2";
                name2 = cmd.ExecuteScalar(); //
它国语言部分显示正常

                // ExecuteReader 获取数据
                cmd.CommandText = "SELECT NAME, NAME2 FROM A001";
                OracleDataReader reader = cmd.ExecuteReader();
                while (reader.Read()) {
                    name = reader.GetValue(0);  //
用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
                    name2 = reader.GetValue(1); //
用方式一插入的数据,它国语言部分显示为乱码;方式二插入的数据,它国语言部分显示正常
                }
            }
        }
 

总结:

入数据方式

数据库字符集为ZHS16GBK编码

数据库字符集为AL32UTF8编码

VARCHAR2

NVARCHAR2

VARCHAR2

NVARCHAR2

直接SQL插入

乱码

乱码

乱码

乱码

SQL带参插入

乱码

正常

正常

正常

 

说明:
当前都是在中文操作系统下测试所得,它国语言版操作系统未知;

 

你可能感兴趣的:(oracle,数据库,object,table,语言,oracle10g)