避免使用Oracle的char型別

壹頁書發表於2014-01-21
儘量避免使用Oracle的char型別,即使只有一個位元組,也應該使用varchar2型別。

char的缺點主要有兩個
1.佔用空間大
    如果宣告一個char(10)的欄位,僅僅使用了一個位元組,剩餘的9個位元組也會使用空格補齊。
    
  1. create table a
  2. (
  3.     id char(10)
  4. );

  5. create table b
  6. (
  7.     id varchar2(10)
  8. );

  9. insert into a values('test');
  10. insert into b values('test');
  11. commit;


2.在JAVA程式中造成隱患
    在下面最常用的JDBC中,查詢一個char型別的欄位,卻查不到任何結果.

  1. public class Test {
  2.     public static void main(String[] args) throws ClassNotFoundException, SQLException {
  3.         Class.forName("oracle.jdbc.OracleDriver");
  4.         Connection connection = DriverManager.getConnection("jdbc:oracle:thin:127.0.0.1:1521:orcl", "edmond", "edmond");
  5.         PreparedStatement ps = connection.prepareStatement("select id from a where id=?");
  6.         ps.setString(1, "test");
  7.         ResultSet result = ps.executeQuery();
  8.         if (result.next()) {
  9.             System.out.println(result.getString(1));
  10.         } else {
  11.             System.out.println("沒有任何記錄");
  12.         }
  13.         result.close();
  14.         ps.close();
  15.         connection.close();
  16.     }
  17. }
主要是因為char型別的欄位,使用空格填充。
所以正確的查詢語句應該是:
select id from a where trim(id)=?
或者
select id from a where id=rpad(?,10)

即使使用了這兩個正確的SQL,也會帶來效能問題。
因為第一個SQL不會利用正常建立的索引,而且在複雜的查詢下,更容易出錯。

所以還是忘了Oracle有char這個型別吧。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1073337/,如需轉載,請註明出處,否則將追究法律責任。

相關文章