szhswl
          宋針還的個人空間
                  在今天開發(fā)過程中,發(fā)現(xiàn)了一查詢結果很怪異,一GOOGLE下才知道是ORACLE對CHAR類型處理的問題,在ORACLE中對CHAR的處理是自動添加空格,比如char(8)存儲'2007-11',則在后面自動添加空格,所以導致以下很多查詢怪異問題(在表test中有字段month為char(8),存儲著'2007-11'一條數(shù)據(jù)):
                  select * from test where month='2007-11'     ---能查出該條數(shù)據(jù)
                  select * from test where month='2007-11    '    ---后面含N個空格,能查出該條數(shù)據(jù)
                  select * from test where month=to_char(to_date('200711','yyyy-mm'),'yyyy-mm')       ---不能查出該條數(shù)據(jù)
                  select * from test where trim(month)=to_char(to_date('200711','yyyy-mm'),'yyyy-mm')   ---能查出該條數(shù)據(jù)

          這里再比較一下char,varchar,varchar2的區(qū)別:
          1.CHAR的長度是固定的,而VARCHAR2的長度是可以變化的, 比如,存儲字符串“abc",對于CHAR (20),表示你存儲的字符將占20個字節(jié)(包括17個空字符),而同樣的VARCHAR2 (20)則只占用3個字節(jié)的長度,20只是最大值,當你存儲的字符小于20時,按實際長度存儲。
          2.CHAR的效率比VARCHAR2的效率稍高。
          3.目前VARCHAR是VARCHAR2的同義詞。工業(yè)標準的VARCHAR類型可以存儲空字符串,但是oracle不這樣做,盡管它保留以后這樣做的權利。Oracle自己開發(fā)了一個數(shù)據(jù)類型VARCHAR2,這個類型不是一個標準的VARCHAR,它將在數(shù)據(jù)庫中varchar列可以存儲空字符串的特性改為存儲NULL值。如果你想有向后兼容的能力,Oracle建議使用VARCHAR2而不是VARCHAR。 

          何時用char?何時用varchar2?
                     CHAR與VARCHAR2是一對矛盾的統(tǒng)一體,兩者是互補的關系.
          VARCHAR2比CHAR節(jié)省空間,在效率上比CHAR會稍微差一些,即要想獲得效率,就必須犧牲一定的空間,這也就是我們在數(shù)據(jù)庫設計上常說的‘以空間換效率’。
             VARCHAR2雖然比CHAR節(jié)省空間,但是如果一個VARCHAR2列經(jīng)常被修改,而且每次被修改的數(shù)據(jù)的長度不同,這會引起‘行遷移’(Row Migration)現(xiàn)象,而這造成多余的I/O,是數(shù)據(jù)庫設計和調(diào)整中要盡力避免的,在這種情況下用CHAR代替VARCHAR2會更好一些。

          個人意見是使用varchar2,因為用char總要特別注意自動添加空格的問題,粗粗說一下這個問題,有什么錯誤還請指教。


          ---------------------------------------------------------------------------------------------------------------------------------
          說人之短,乃護己之短。夸己之長,乃忌人之長。皆由存心不厚,識量太狹耳。能去此弊,可以進德,可以遠怨。
          http://www.aygfsteel.com/szhswl
          ------------------------------------------------------------------------------------------------------ ----------------- ---------
          posted on 2007-12-11 15:18 宋針還 閱讀(2188) 評論(3)  編輯  收藏

          FeedBack:
          # re: oracle的char類型對空格的怪異處理
          2007-12-12 10:29 | jeasonzhao
          我覺得,為了安全起見,還是實現(xiàn)varCHAR,因為最終這個Trim的操作還是要做的,不管是客戶端還是SQL語句,都會帶來性能開銷,與其這樣,還不如從源頭上掐斷  回復  更多評論
            
          # re: oracle的char類型對空格的怪異處理
          2008-01-08 12:25 | 肖遙
          日期用char存本來就是你的不對了  回復  更多評論
            
          # re: oracle的char類型對空格的怪異處理
          2008-02-21 08:51 | yangzl
          樓上不要只盯住日期的問題,其實varchar2和char的匹配確實存在問題的  回復  更多評論
            

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


          網(wǎng)站導航:
           
          主站蜘蛛池模板: 杂多县| 长顺县| 富蕴县| 伊宁市| 老河口市| 屏南县| 红安县| 郓城县| 西林县| 江陵县| 开远市| 来宾市| 鹤壁市| 济阳县| 鸡泽县| 中卫市| 舞钢市| 泗阳县| 新民市| 广州市| 泉州市| 黑水县| 富锦市| 思茅市| 康乐县| 吕梁市| 九江市| 桃源县| 平武县| 阿合奇县| 文化| 南京市| 谷城县| 五河县| 金门县| 安溪县| 油尖旺区| 尼勒克县| 开阳县| 榆树市| 兴业县|