Oracle資料庫為AL32UTF8時VARCHAR2即可存Unicode

學海無涯!

一直以來,要放Unicode文字就得開NVARCHAR欄位的觀念深植我心。直到今天聽一位同事說: 如果Oracle資料庫的字元集設成Unicode,開VARCHAR就好了,不必為Unicode特意開NVARCHAR。

這顛覆了我的認知,但也不確定我根深蒂固的觀念是否隨軟體版本演進早已有所誤差。在噗浪上發問後,陸續收到一些回應: Access, MySQL, PostgreSQL都是如此(謝謝Bill, 鳥毅),噗友王圓外更是直接證實這點,於是也我寫了個小程式,找了台NLS_CHARACTERSET=AL32UTF8的Oracle驗證:

using (OracleConnection cn = new OracleConnection(cnStr))
{
    cn.Open();
    OracleCommand cmd = new OracleCommand();
    cmd.Connection = cn;
    cmd.CommandText = 
        "SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER = 'NLS_CHARACTERSET'";
    OracleDataReader dr = cmd.ExecuteReader();
    dr.Read();
    Response.Write("<li>NLS_CHARACTERSET=" + dr[1].ToString());
    cmd.CommandText = "CREATE TABLE JEFFTEST (T1 VARCHAR2(16), T2 NVARCHAR2(16))";
    cmd.ExecuteNonQuery();
    cmd.CommandText = "INSERT INTO JEFFTEST VALUES (:p1, :p2)";
    cmd.Parameters.Add("p1", OracleType.VarChar).Value = "犇";
    cmd.Parameters.Add("p2", OracleType.NVarChar).Value = "犇";
    cmd.ExecuteNonQuery();
    cmd.CommandText = "SELECT * FROM JEFFTEST";
    cmd.Parameters.Clear();
    dr = cmd.ExecuteReader();
    dr.Read();
    Response.Write("<li>T1=" + dr[0].ToString());
    Response.Write("<li>T2=" + dr[1].ToString());
    cmd.CommandText = "DROP TABLE JEFFTEST";
    cmd.ExecuteNonQuery();
}

執行結果如下,證明當Oracle NLS_CHARACTERSET=AL32UTF8時,VARCHAR2也能存Unicdoe。

  • NLS_CHARACTERSET=AL32UTF8
  • T1=犇
  • T2=犇
  • 不過,如果涉及多台DB,我不確定有的用VARCHAR,有的用NVARCHAR是否會有問題? 在工作環境涉及的Oracle在未全面採行Unicode前,我想我還是會採用NVARCHAR較保險(反正沒有損失)。

    歡迎推文分享:
    Published 15 July 2010 07:28 PM 由 Jeffrey
    Filed under: ,
    Views: 11,468



    意見

    # bcse said on 15 July, 2010 10:39 AM

    (舉手) 可是 Access, MySQL, PostgreSQL 根本沒有 NVARCHAR 呀…

    你的看法呢?

    (必要的) 
    (必要的) 
    (選擇性的)
    (必要的) 
    (提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

    5 + 3 =

    搜尋

    Go

    <July 2010>
    SunMonTueWedThuFriSat
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567
     
    RSS
    創用 CC 授權條款
    【廣告】
    twMVC
    最新回應

    Tags 分類檢視
    關於作者

    一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

    文章典藏
    其他功能

    這個部落格


    Syndication