老生常談的Oracle的CHAR與VARCHAR數(shù)據(jù)類型

開門見山直接說問題腔寡,前一段時(shí)候生產(chǎn)上進(jìn)行數(shù)據(jù)庫的變更绅项,導(dǎo)致了在短時(shí)間內(nèi)業(yè)務(wù)的異常曲尸,最后通過將CHAR類型修改為VARCHAR2類型后解決了該問題赋续。

一、問題背景

舉一個(gè)類似的例子另患,我們有一個(gè)學(xué)生表STUDNET纽乱,表結(jié)構(gòu)與數(shù)據(jù)如下,系統(tǒng)升級(jí)前只支持本科生的管理昆箕,系統(tǒng)升級(jí)后要添加研究生的管理功能鸦列,但是學(xué)號(hào)的位數(shù)不一致,所以由原來的CHAR(5)修改為CHAR(7)鹏倘,后面發(fā)現(xiàn)本科生管理功能不能正常時(shí)候薯嗤,后將CHAR(5)修改為VARCHAR2(7)后恢復(fù)使用。
表結(jié)構(gòu):

SQL> desc student;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 STU_ID                                    NOT NULL CHAR(7)
 STU_NAME                                           VARCHAR2(10)
 STU_GENDER                                         VARCHAR2(5)

數(shù)據(jù):

SQL> select * from student;
STU_ID  STU_NAME   STU_G
------- ---------- -----
1001    小明       男
1002    小剛       男
2001001 小米       女
2001002 小敏       女

二纤泵、問題干擾

對(duì)于CHAR和VARCHAR的數(shù)據(jù)類型的問題有一點(diǎn)數(shù)據(jù)庫基礎(chǔ)的同學(xué)應(yīng)該都知道骆姐,CHAR是定長(zhǎng),VARCHAR是變長(zhǎng)捏题,但是在問題的分析上我們受到了一些表面現(xiàn)象的干擾诲锹,通過PLSQL或者SQLPLUS對(duì)如下語句進(jìn)行查詢,發(fā)現(xiàn)無論條件是1001還是1001_都可以查詢到數(shù)據(jù)涉馅,這也會(huì)給經(jīng)驗(yàn)不足的開發(fā)人員一定的干擾归园,理所當(dāng)然的認(rèn)為程序去跑該SQL也沒有問題,但是后面我們發(fā)現(xiàn)業(yè)務(wù)通過Mybatis執(zhí)行該SQL沒有查詢到對(duì)應(yīng)的數(shù)據(jù)稚矿。

SQL> select * from student where stu_id='1001';       
STU_ID  STU_NAME   STU_G
------- ---------- -----
1001    小明       男

SQL> select * from student where stu_id='1001 ';
STU_ID  STU_NAME   STU_G
------- ---------- -----
1001    小明       男

三庸诱、問題解決

1.我們知道CHAR類型是定長(zhǎng),如果長(zhǎng)度不足該字段定義的長(zhǎng)度晤揣,那會(huì)自動(dòng)在后面補(bǔ)足空格桥爽,在PLSQL或者SQLPLUS中對(duì)CHAR類型列進(jìn)行查詢時(shí),會(huì)自動(dòng)補(bǔ)齊查詢條件中的空格(換一種說法也可以理解為查詢的值和被查詢的值都進(jìn)行了末端去空格處理)昧识。
2.但是在程序去操作數(shù)據(jù)庫時(shí)钠四,如使用Mybatis或Hibernate去查詢數(shù)據(jù)時(shí)就不會(huì)做一些額外的操作,所以執(zhí)行下列語句時(shí)會(huì)查不到對(duì)應(yīng)的數(shù)據(jù)跪楞,原因是1000與1001___不相等缀去。

select * from student where stu_id='1001';       

3.那解決這個(gè)問題的思路有兩個(gè),一個(gè)是按照如下方式改寫SQL甸祭,將CHAR類型的列中后面的空格去掉缕碎,另一種方案是將CHAR類型改為VARCHAR2類型,我個(gè)人推薦第二種池户。

SQL> select * from student where trim(stu_id)='1001';
STU_ID  STU_NAME   STU_G
------- ---------- -----
1001    小明       男       

四咏雌、學(xué)習(xí)知識(shí)

1.CHAR與VARCHAR的比較

  • 首先凡怎,CHAR為定長(zhǎng),VARCHAR為變長(zhǎng)赊抖,在空間上VARCHAR會(huì)比較節(jié)省空間统倒。其次,在查詢效率上氛雪,CHAR會(huì)比VARVHAR快一些房匆,因?yàn)樘幚鞻ARVHAR類型還會(huì)有一些額外的操作。
  • 我看還有一種說法是說如果VARCHAR類型的列存儲(chǔ)的內(nèi)容長(zhǎng)度經(jīng)常改變會(huì)發(fā)生“行遷移”的現(xiàn)象注暗,所以會(huì)導(dǎo)致VARCHAR效率比較慢坛缕,這種說法我不是很同意,因?yàn)榧词勾嬖贑HAR類型的列的內(nèi)容長(zhǎng)度不變捆昏,如果該行其他的列的長(zhǎng)度經(jīng)常更改也會(huì)造成“行遷移”赚楚。

2.VARCHAR與VARCHAR2的比較
目前在ORACLE中VARCHAR是VARCHAR2的同義詞。標(biāo)準(zhǔn)的VARCHAR類型可以存儲(chǔ)空字符串骗卜,ORACLE自己設(shè)計(jì)了一個(gè)VARCHAR2的數(shù)據(jù)類型宠页,它將存儲(chǔ)空字符串的特性改為存儲(chǔ)NULL值。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末寇仓,一起剝皮案震驚了整個(gè)濱河市举户,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遍烦,老刑警劉巖俭嘁,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異服猪,居然都是意外死亡供填,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門罢猪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來近她,“玉大人,你說我怎么就攤上這事膳帕≌成樱” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵危彩,是天一觀的道長(zhǎng)攒磨。 經(jīng)常有香客問我,道長(zhǎng)恬砂,這世上最難降的妖魔是什么咧纠? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮泻骤,結(jié)果婚禮上漆羔,老公的妹妹穿的比我還像新娘。我一直安慰自己狱掂,他們只是感情好演痒,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趋惨,像睡著了一般鸟顺。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上器虾,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天讯嫂,我揣著相機(jī)與錄音,去河邊找鬼兆沙。 笑死欧芽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的葛圃。 我是一名探鬼主播千扔,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼库正!你這毒婦竟也來了曲楚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤褥符,失蹤者是張志新(化名)和其女友劉穎龙誊,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體喷楣,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡趟大,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抡蛙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片护昧。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖粗截,靈堂內(nèi)的尸體忽然破棺而出惋耙,到底是詐尸還是另有隱情,我是刑警寧澤熊昌,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布绽榛,位于F島的核電站,受9級(jí)特大地震影響婿屹,放射性物質(zhì)發(fā)生泄漏灭美。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一昂利、第九天 我趴在偏房一處隱蔽的房頂上張望届腐。 院中可真熱鬧铁坎,春花似錦、人聲如沸犁苏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽围详。三九已至朴乖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間助赞,已是汗流浹背买羞。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雹食,地道東北人畜普。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像婉徘,于是被迫代替她去往敵國(guó)和親漠嵌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容