<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    mashiguang

    小馬快跑

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      20 隨筆 :: 0 文章 :: 60 評論 :: 0 Trackbacks

    在Oracle定義變量時,常有VARCHAR2 (3 Char)或者VARCHAR2 (10 Byte)的數(shù)據(jù)類型,那么3char或者10Byte到底代表幾個漢字,幾個字符呢,上次外公司一同事討論這個問題,一下沒給解釋清楚,所以下來以后整理如下:

    總結(jié):
    當(dāng)NLS_CHARACTERSET=AL32UTF8時()
    NLS_LENGTH_SEMANTICS=BYTE時,一個漢字代表三個字節(jié)
    NLS_LENGTH_SEMANTICS=CHAR時,一個漢字代表一個字節(jié)
    當(dāng)NLS_CHARACTERSET=US7ASCII時(字符集為單字節(jié))
    NLS_LENGTH_SEMANTICS=BYTE時,一個漢字代表兩個字節(jié)
    NLS_LENGTH_SEMANTICS=CHAR時,一個漢字代表兩個字節(jié)

    現(xiàn)象:
    select * from nls_database_parameters;
    ….      …………..
    NLS_CHARACTERSET        AL32UTF8

    …..

    NLS_LENGTH_SEMANTICS BYTE

    ….

    NLS_NCHAR_CHARACTERSET      AL16UTF16

    NLS_RDBMS_VERSION      10.2.0.4.0
     

    SQL> alter session set nls_length_semantics='BYTE';

    SQL> create table nls_byte(c1 varchar2(7));

    SQL> insert into nls_byte values('測試機');

     insert into nls_byte values('測試機')

     ORA-12899: 列 "SYS"."NLS_BYTE"."C1" 的值太大 (實際值: 9, 最大值: 7)

    SQL> insert into nls_byte values('測試a');

     1 row inserted
     
    SQL> select table_name,column_name,t.DATA_TYPE,t.DATA_LENGTH,t.CHAR_USED from user_tab_columns t where table_name='NLS_BYTE';

     TABLE_NAME COLU DATA_TYP DATA_LENGTH CHAR_USED

    ---------- ---- -------- ----------- ---------

    NLS_BYTE   C1   VARCHAR2           7 B
      
    NLS_LENGTH_SEMANTICS allows you to specify the length of a column datatype in terms of CHARacters rather than in terms of BYTEs. Typically this is when using an AL32UTF8 or other varying width NLS_CHARACTERSET database where one character is not always one byte. While using CHAR semantics has as such no added value in a 7/8 bit characterset it's fully supported so any application code / table setup using CHAR can also be used in a 7/8bit characterset like US7ASCII/WE8MSWIN1252.
    This parameter is a 9i (and up) feature and is not available in older releases

    翻譯過來就是:這個參數(shù)允許將列的數(shù)據(jù)單位設(shè)為字符而不是byte.這個問題會在字符集設(shè)為UTF8的時候出現(xiàn). 此參數(shù)在9i以上版本有效.

    NLS_LENGTH_SEMANTICS 設(shè)置.

    1.      NLS_DATABASE_PARAMETERS中的值是在數(shù)據(jù)庫創(chuàng)建的時候確定的,一般都為BYTE

    2.     此參數(shù)可以以 “ALTER SYSTEM SET NLS_LENGTH_SEMANTICS=CHAR scope=both”方式修改,但是需要重啟數(shù)據(jù)庫才能生效.

    3.     也可用” ALTER SESSION SET NLS_LENGTH_SEMANTICS=CHAR”使對當(dāng)前session生效.

    4.     此參數(shù)可以在10G以上版本中,在環(huán)境變量或注冊表中設(shè)置(注意需要大寫),設(shè)定后從當(dāng)前客戶端啟動的所有會話都采用新的取值.

    5.     修改后只對新建的列生效,對于已有的列沒有作用

    6.     新建或升級DB時用BYTE,否則XDB或dba_tables會出現(xiàn)問題.

    7.     NLS_LENGTH_SEMANTICS對sys用戶下的對象無效.

    8.     如果對于7/8bit的字符集,設(shè)為byte/char意義不大,因為無論是char和byte都對應(yīng)一個byte.

    測試:

    一.在當(dāng)前session中修改此參數(shù)

     SQL> alter session set nls_length_semantics='char';

     Session altered

     SQL> create table nls_char(c1 varchar2(7),c2 varchar2(7));

     Table created

     SQL> desc nls_char

    Name Type        Nullable Default Comments

    ---- ----------- -------- ------- --------

    C1   VARCHAR2(7) Y                      

    C2   VARCHAR2(7) Y                      

     SQL> insert into nls_char values('測試機','測試測試測試');

     1 row inserted 

    如果對于alter system,效果是一樣的

    二.對于已經(jīng)存在的表,

     SQL> desc nls_byte

    Name Type             Nullable Default Comments

    ---- ---------------- -------- ------- --------

    C1   VARCHAR2(7 BYTE) Y                      

    SQL> alter table nls_byte modify c1 varchar2(7 char);

     Table altered

     SQL> desc nls_byte

    Name Type        Nullable Default Comments

    ---- ----------- -------- ------- --------

    C1   VARCHAR2(7) Y                      

     SQL> insert into nls_byte values('測試機');

     1 row inserted
     
    1.      exp/imp : 不能直接導(dǎo)入,因為會采用source table的建表方式在target db里建表,即使目標(biāo)庫設(shè)的值為char.

    *可以預(yù)先在目標(biāo)庫中以char方式建表

    *然后導(dǎo)入,指定參數(shù)ignore=y

      2. Alter table

         alter table "<owner>"."<table>" modify "<column>" char (10 char);

          創(chuàng)建腳本,修改列設(shè)定.

     注:

    Bug-3611750, ora-01450 online rebuild of index fails, 可以在重建索引前指定byte, 10.2.0.5以上已經(jīng)修復(fù)

    Bug 1488174 UNICODE: ALTER SYSTEM SET NLS_LENGTH_SEMANTICS DOESN'T
    TAKE EFFECT, 用此語句修改后,實際上不起作用,需要重啟才能生效, 但是如果用alter session方式即時生效,不用重啟.

    進一步測試,在另一個字符集設(shè)為us7ascii的DB設(shè)置此參數(shù)

    SQL> select * from nls_database_parameters

    6          NLS_CHARACTERSET  US7ASCII

    SQL> alter session set nls_length_semantics=byte;

    Session altered.

    SQL> create table nls_byte(c1 varchar2(7));

    Table created.

    SQL> insert into  nls_byte values('測試測試');

    insert into  nls_byte values('測試測試')

    ERROR at line 1:

    ORA-12899: value too large for column "TEA"."NLS_BYTE"."C1" (actual: 8,

    maximum: 7)

    SQL> desc nls_byte

     Name                        Null?    Type

     -------------------------------

     C1                                   VARCHAR2(7)

    SQL> alter session set nls_length_semantics=char;

    Session altered.

    SQL> create table nls_char(c1 varchar2(7));

    Table created.

    SQL> insert into  nls_char values('測試測試');

    insert into  nls_char values('測試測試')

    ERROR at line 1:

    ORA-12899: value too large for column "TEA"."NLS_CHAR"."C1" (actual: 8,

    maximum: 7)

    SQL> desc nls_char

     Name                        Null?    Type

     ----------------------------------------- -------- -------------------

    C1                                  VARCHAR2(7)
     
     可以看出,在字符集為單字節(jié)的情況下,無論取何值,漢字都是以二個字節(jié)的方式存在的.

     


    本文轉(zhuǎn)自http://www.wudeyao.com/post-69.html
    posted on 2011-01-21 12:49 mashiguang 閱讀(1412) 評論(0)  編輯  收藏 所屬分類: 數(shù)據(jù)庫相關(guān)

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     
    主站蜘蛛池模板: 亚洲国产天堂久久综合网站| 亚洲中文字幕视频国产| 久久久久亚洲AV成人无码网站| 久久久精品国产亚洲成人满18免费网站| 国产婷婷成人久久Av免费高清 | 亚洲美女aⅴ久久久91| 男女拍拍拍免费视频网站| 亚洲国产精品尤物yw在线| 亚洲国产成人久久精品软件| 最新69国产成人精品免费视频动漫| 24小时免费直播在线观看| 久久精品国产亚洲| 国产麻豆成人传媒免费观看| 中文亚洲AV片在线观看不卡| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 日韩亚洲综合精品国产| 国产真实伦在线视频免费观看| 国产亚洲精品成人AA片新蒲金| 亚洲精品电影天堂网| 精品无码免费专区毛片| 亚洲一卡二卡三卡四卡无卡麻豆| 日本一区二区三区在线视频观看免费 | 亚洲国产av美女网站| 67194国产精品免费观看| 亚洲免费二区三区| 国产精品视_精品国产免费| 男女啪啪免费体验区| 亚洲妇熟XXXX妇色黄| 日本黄网站动漫视频免费| 国产亚洲精品VA片在线播放| 免费日韩在线视频| a级毛片免费观看视频| 亚洲精品在线免费看| 国产成人免费a在线视频色戒| 在线免费观看亚洲| 毛片免费视频播放| 一级毛片免费视频网站| 亚洲妇熟XXXX妇色黄| 好大好深好猛好爽视频免费| 深夜福利在线视频免费| 亚洲国产精品人久久|