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

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

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

    Atea - Hero's Grave

    面向?qū)ο螅_源,框架,敏捷,云計(jì)算,NoSQL,商業(yè)智能,編程思想。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      40 隨筆 :: 0 文章 :: 28 評論 :: 0 Trackbacks
    在ORACLE中,CHAR類型的字段值會自動補(bǔ)足空格。所以當(dāng)其作為條件時(shí),就有可能查不出想要的數(shù)據(jù)。
    如果不允許改DB設(shè)計(jì)的話,那就用RTRIM來解決吧。例:

    DB:
    CREATE TABLE TEST
    (
        TEST_ID                        
    VARCHAR2(64NOT NULL,
        TEST_CHAR                      
    CHAR(10),
        
    CONSTRAINT TEST_ID PRIMARY KEY (TEST_ID)
    );
    INSERT INTO TEST VALUES('1','a');

    測試代碼:
    Session session = factory.getCurrentSession();
    session.beginTransaction();
    List list 
    = session.createQuery("FROM Test WHERE RTRIM(TEST_CHAR) = 'a'").list();
    session.close();
    assertTrue(list.size() 
    > 0);

    輸出結(jié)果(ORACLE):
    Hibernate: 
        
    select
            test0_.TEST_ID 
    as TEST1_0_,
            test0_.TEST_CHAR 
    as TEST4_0_ 
        
    from
            TEST test0_ 
        
    where
            
    rtrim(TEST_CHAR)='a'
    14:09:53,171DEBUG StringType:172 - returning '1' as column: TEST1_0_
    14:09:53,187DEBUG StringType:172 - returning 'a         ' as column: TEST4_0_

    而MySQL不會自動補(bǔ)足空格,同樣的代碼也是可以適用的:
    輸出結(jié)果(MySQL):
    Hibernate: 
        
    select
            test0_.TEST_ID 
    as TEST1_0_,
            test0_.TEST_CHAR 
    as TEST4_0_ 
        
    from
            TEST test0_ 
        
    where
            
    rtrim(TEST_CHAR)='a'
    14:09:01,828DEBUG StringType:172 - returning '1' as column: TEST1_0_
    14:09:01,828DEBUG StringType:172 - returning 'a' as column: TEST4_0_

    ------------------------------------------------------------
    08/11/26更新
    事實(shí)上用以下方法加不加RTRIM都能取出數(shù)據(jù):
    List list = session.createQuery("FROM Test WHERE TEST_CHAR = 'a'").list();

    我建了一個(gè)表:create table test(name char(7));內(nèi)有N條值為hello的記錄
    第一種:不用占位符,
    java.sql.PreparedStatement ps 
    = connection().prepareStatement("select * from test where name='hello'");
    java.sql.ResultSet rs 
    = ps.executeQuery();
    記錄集rs有數(shù)據(jù);
    第二種:使用占位符,
    java.sql.PreparedStatement ps 
    = connection().prepareStatement("select * from test where name=?");
    ps.setString(
    1,"hello");
    java.sql.ResultSet rs 
    =
     ps.executeQuery();
    記錄集rs中無任何數(shù)據(jù)。

    引用http://www.javaeye.com/post/152778

    看來如果用PrepareStatement的話就有可能發(fā)生問題。另外,由于RTRIM可能帶來索引失效,使用RPAD(expr,n[,pad])也是一種不錯的選擇。
    posted on 2008-11-11 14:45 Atea 閱讀(4074) 評論(4)  編輯  收藏 所屬分類: Database

    評論

    # re: ORACLE中CHAR類型自動補(bǔ)足空格的問題 2008-11-11 15:36 lveyo
    如果在TEST_CHAR上有索引,用了rtrim函數(shù),索引就失效了。

    那就要注意建立rtrim的函數(shù)索引。  回復(fù)  更多評論
      

    # re: ORACLE中CHAR類型自動補(bǔ)足空格的問題 2008-11-11 16:46 Atea
    @lveyo
    這確實(shí)可能是個(gè)問題,謝謝指教:)
    CREATE INDEX test_index_method on TEST(RTRIM(TEST_CHAR));

    但其他的DB(如MySQL)有沒有函數(shù)索引功能就另說了,看來到時(shí)候需要另想辦法。  回復(fù)  更多評論
      

    # re: ORACLE中CHAR類型自動補(bǔ)足空格的問題[未登錄] 2008-11-11 21:44 yy
    為什么一定要用char????
    oracle推薦使用VARCHAR2  回復(fù)  更多評論
      

    # re: ORACLE中CHAR類型自動補(bǔ)足空格的問題 2008-11-12 08:29 Atea
    @yy
    要是我也用VARCHAR2。
    猜想可能是沿用以前的表設(shè)計(jì)。在網(wǎng)上也看到一種說法說CHAR比VARCHAR速度快。  回復(fù)  更多評論
      

    主站蜘蛛池模板: 午夜亚洲WWW湿好爽| 国产精品视频白浆免费视频| 亚洲中文字幕成人在线| 国产午夜无码精品免费看动漫| 亚洲成年人免费网站| 国产一区二区三区免费在线观看 | 波多野结衣中文一区二区免费| 一级中文字幕乱码免费| 亚洲国产综合专区电影在线| 国内大片在线免费看| 国产又黄又爽又大的免费视频| 亚洲一区二区影视| 一本久久a久久精品亚洲| 99热在线精品免费全部my| 一本一道dvd在线观看免费视频| 久久久久久亚洲精品成人| 波多野结衣中文一区二区免费| 久久久久高潮毛片免费全部播放| 老司机福利在线免费观看| 亚洲国产精品成人综合久久久| 中文字幕亚洲综合久久菠萝蜜| 最近中文字幕mv手机免费高清| 久久久久久影院久久久久免费精品国产小说 | 亚洲av不卡一区二区三区| 国产色爽免费视频| 日本三级2019在线观看免费| 国产免费高清69式视频在线观看| 亚洲国产激情在线一区| 亚洲国产老鸭窝一区二区三区| 婷婷亚洲天堂影院| 巨胸喷奶水视频www网免费| 91香蕉在线观看免费高清| av午夜福利一片免费看久久| 亚洲国产精华液2020| 亚洲资源在线视频| 国产亚洲精品线观看动态图| 国产又长又粗又爽免费视频| 免费无码A片一区二三区| 免费A级毛片无码专区| 免费人成在线观看视频高潮| 日本免费精品一区二区三区 |