天天看点

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带参插入 乱码 正常 正常 正常

说明:

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