避免使用Oracle的char型別
儘量避免使用Oracle的char型別,即使只有一個位元組,也應該使用varchar2型別。
char的缺點主要有兩個
1.佔用空間大
如果宣告一個char(10)的欄位,僅僅使用了一個位元組,剩餘的9個位元組也會使用空格補齊。
2.在JAVA程式中造成隱患
在下面最常用的JDBC中,查詢一個char型別的欄位,卻查不到任何結果.
主要是因為char型別的欄位,使用空格填充。
所以正確的查詢語句應該是:
select id from a where trim(id)=?
或者
select id from a where id=rpad(?,10)
即使使用了這兩個正確的SQL,也會帶來效能問題。
因為第一個SQL不會利用正常建立的索引,而且在複雜的查詢下,更容易出錯。
所以還是忘了Oracle有char這個型別吧。
char的缺點主要有兩個
1.佔用空間大
如果宣告一個char(10)的欄位,僅僅使用了一個位元組,剩餘的9個位元組也會使用空格補齊。
-
create table a
-
(
-
id char(10)
-
);
-
-
create table b
-
(
-
id varchar2(10)
-
);
-
-
insert into a values('test');
-
insert into b values('test');
- commit;
2.在JAVA程式中造成隱患
在下面最常用的JDBC中,查詢一個char型別的欄位,卻查不到任何結果.
-
public class Test {
-
public static void main(String[] args) throws ClassNotFoundException, SQLException {
-
Class.forName("oracle.jdbc.OracleDriver");
-
Connection connection = DriverManager.getConnection("jdbc:oracle:thin:127.0.0.1:1521:orcl", "edmond", "edmond");
-
PreparedStatement ps = connection.prepareStatement("select id from a where id=?");
-
ps.setString(1, "test");
-
ResultSet result = ps.executeQuery();
-
if (result.next()) {
-
System.out.println(result.getString(1));
-
} else {
-
System.out.println("沒有任何記錄");
-
}
-
result.close();
-
ps.close();
-
connection.close();
-
}
- }
所以正確的查詢語句應該是:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- const char* 型別不能用於初始化char* 型別實體型別
- 【C++】CONST CHAR*型別的值不能用於初始化CHAR*型別的實體C++型別
- E0144 "const char *" 型別的值不能用於初始化 "char *" 型別的實體型別
- NTMySQL中varchar和char型別的區別heeMySql型別
- 【VS2019 C++】"const char *" 型別的值不能用於初始化 "char *" 型別的實體C++型別
- 當char型變數遇上char*型的指標變數指標
- C# - char型別的一些介紹C#型別
- MySQL資料型別操作(char與varchar)MySql資料型別
- 【筆記】VS2017中出現 "const char *" 型別的值不能用於初始化 "char *" 型別的實體筆記型別
- VS2019【C++報錯】E0144"const char *" 型別的值不能用於初始化 "char *" 型別的實體C++型別
- VS中”LPTSTR" 型別的值不能用於初始化 "char *" 型別的實體型別
- CString與LPCWSTR、LPSTR、char*、LPWSTR等型別的轉換型別
- char *的使用
- Java char 型別究竟佔幾個位元組?Java型別
- std::cout 輸出 unsigned char型別資料型別
- const char*, char const*, char*const 有何區別?
- C++中出現《E0144 "const char *" 型別的值不能用於初始化 "char *" 型別的實體》的錯誤解決方法C++型別
- VS C++ 2017中const char* 型別的值不能用於初始化char*的解決C++型別
- Python工作筆記-往dll中傳入char*型別的引數並且如何接收char*的值Python筆記型別
- ORACLE日期型別Oracle型別
- varchar和char的區別
- MySQL中資料型別(char(n)、varchar(n)、nchar(n)、nvarchar(n)的區別)MySql資料型別
- 關於VS2017中const char *不能用於初始化char *型別的實體的問題型別
- Oracle的number資料型別Oracle資料型別
- CAPL指令碼中常用到的資料型別轉換——數字型別(int/double)和字串型別(char array)指令碼資料型別字串
- VS2019中出現E01104“const char *”型別的值不能用於初始化“char *”型別的實體的錯誤的解決辦法型別
- Oracle資料型別對應Java型別Oracle資料型別Java
- ORACLE物件型別表Oracle物件型別
- Oracle 資料型別Oracle資料型別
- 1.1. Oracle 資料庫使用者型別Oracle資料庫型別
- 【轉】ORACLE資料型別Oracle資料型別
- Oracle anydata資料型別Oracle資料型別
- ORACLE NUMBER資料型別Oracle資料型別
- Oracle DG Standby Database型別OracleDatabase型別
- Oracle OCP(19):資料型別Oracle資料型別
- oracle數值型別漫談Oracle型別
- Rust中 String、str、&str、char 的區別Rust
- Redis Stream型別的使用Redis型別
- 基本資料型別與API引用型別的使用資料型別API