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帶參插入

亂碼

正常

正常

正常

 

說明:
當前都是在中文操作系統下測試所得,它國語言版操作系統未知;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章