<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ū)ο螅_源,框架,敏捷,云計算,NoSQL,商業(yè)智能,編程思想。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      40 隨筆 :: 0 文章 :: 28 評論 :: 0 Trackbacks
    在ORACLE中,CHAR類型的字段值會自動補足空格。所以當(dāng)其作為條件時,就有可能查不出想要的數(shù)據(jù)。
    如果不允許改DB設(shè)計的話,那就用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不會自動補足空格,同樣的代碼也是可以適用的:
    輸出結(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更新
    事實上用以下方法加不加RTRIM都能取出數(shù)據(jù):
    List list = session.createQuery("FROM Test WHERE TEST_CHAR = 'a'").list();

    我建了一個表: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 閱讀(4073) 評論(4)  編輯  收藏 所屬分類: Database

    評論

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

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

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

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

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

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

    主站蜘蛛池模板: eeuss影院www天堂免费| 美女免费视频一区二区| 亚洲精品免费在线观看| 亚洲AV成人精品网站在线播放| 中文字幕在线视频免费观看| 亚洲三区在线观看无套内射| a毛片免费全部在线播放**| 国产成人亚洲精品青草天美| 日本免费A级毛一片| 亚洲AV乱码一区二区三区林ゆな| 嫩草影院在线播放www免费观看 | 国产在线精品免费aaa片| 亚洲人成无码网站| 一级毛片免费播放| 亚洲免费在线视频观看| 手机在线看永久av片免费| 亚洲女女女同性video| 国产hs免费高清在线观看| 黄色网址免费在线观看| 亚洲国产天堂久久综合网站| 中国在线观看免费高清完整版| 亚洲av永久中文无码精品综合| 亚洲国产主播精品极品网红| 亚洲视频免费在线观看| 亚洲AV色吊丝无码| 亚洲福利在线播放| 日韩在线不卡免费视频一区| 国产精品亚洲精品青青青| 亚洲成年看片在线观看| 日本视频在线观看永久免费| 亚洲人成www在线播放| 又爽又黄无遮挡高清免费视频| 国产真人无码作爱免费视频| 亚洲成AV人片久久| 人人狠狠综合久久亚洲高清| 四虎影视在线影院在线观看免费视频 | 亚洲精品午夜视频| 日本高清免费不卡视频| 嫩草在线视频www免费看| 中国亚洲呦女专区| 亚洲国产精品无码久久久不卡 |