1. char類型的長度是固定的,varchar的長度是可變的。
這就表示,存儲字符串'abc',使用char(10),表示存儲的字符將占10個字節(包括7個空字符)
使用varchar2(10),,則表示只占3個字節,10是最大值,當存儲的字符小於10時,按照實際的長度存儲。
2.char類型的效率比varchar的效率稍高
3.varchar 與 varchar2的區別
varchar2是oracle開發的一個數據類型。
工業標准的varchar可以存儲空字符串,oracle的varchar2還可以存儲NULL值,如果想要有向后兼容的能力建議使用varchar2
4.varchar2比char節省空間,但是在效率上比char稍差些。既要獲得效率即必須犧牲一點空間,這就是設計上的"以空間換時間"
varchar2雖然比char節省空間,但是一個varchar2列經常被修改,而且每次修改的數據長度不同,這會引起“行遷移的現象”,
而這造成的多余的I/O,是數據庫設計中盡量避免的,在這種情況下使用char代替varchar2會更好些。
總結:1. 如果一個字段經常被修改,而且每次修改的數據長度不同,為了效率應當考慮用char定長代替varchar2變長。(列如一個用戶的名字經常被修改)
2. 設計的時候盡量考慮 用空間換時間。
nvarchar 和 varchar 的區別是存儲方式不同 :
varchar是按字節存儲的,而帶"n"的nvarchar是按字符存儲的。比如說 varchar(40),能存儲40個字節長度的字符,存儲中文字符的時候,因為中文字符1個字符就等於2個字節.所以varchar(40)只能存儲20個中文字符.
nvarchar(40),就可以存儲40個中文字符,也就是說可以存儲80個字節長度的字符.nvarchar要相對於存儲的字符類型.比如有些字符是占3個字節的。同樣的,char和nchar也一樣道理。char是定長的,也就是當你輸入的字符小於你指定的數目時,char(8),你輸入的字符小於8時,它會再后面補空值。當你輸入的字符大於指定的數時,它會截取超出的字符。varchar是變長型,它的存儲空間會跟你輸入的實際字符數而改變,但最大長度不能超過你指定的長度。
nvarchar是unicode的變長型,它和char的區別很明顯了,它和varchar的區別主要是存儲空間大,相同長度下能容內更多的字符。字符集是在安裝 SQL Server 時選擇的,不能更改。使用 Unicode 數據類型,列可存儲由 Unicode 標准定義的任何字符,包含由不同字符集定義的所有字符。Unicode 數據類型需要相當於非 Unicode 數據類型兩倍的存儲空間。
以前在實際開發中遇到別人把比對狀態設置成char(3) 在navicate能查到響應的結果 但是在mybatis中卻不能 解決方法、
1 將長度改為1 可能會報錯 因為長度變小了
2 trim()函數去空格:
二、深入了解mybatis返回null
拋開mybatis框架,回到原始的jdbc查詢,當使用oracle的char類型作為條件查詢數據時,只有值完全一樣時才能查到數據。
如創建一個測試表:
create table t_user( user_name char(5) ); insert into t_user (user_name)values('sgl');
select '"'||user_name||'"' from t_user
; -- 查詢結果為"sgl ",可以看出oracle自動補了兩個空格
通過jdbc的PreparedStatement方式查詢數據:
conn=getConnection(); ps=conn.prepareStatement("select * from t_user where user_name=?"); ps.setString(1,"sgl"); ResultSet rs = ps.executeQuery();
通過上面方式是無法查到數據的,因為查詢條件值”sgl”和數據庫中值”sgl “是不相等的。
如果值用“sgl ”可以查到數據
conn=getConnection(); ps=conn.prepareStatement("select * from t_user where user_name=?"); ps.setString(1,"sgl "); -- 增加兩個空格不足5位長度 ResultSet rs = ps.executeQuery();
如果使用trim()方式也可以查詢到數據,如:
ps=conn.prepareStatement("select * from t_user where trim(user_name)=?"); -- 先對數據庫中user_name進行去空格,然后再比較 ps.setString(1,"sgl"); ResultSet rs = ps.executeQuery();
參考博客:https://www.cnblogs.com/xianlei/p/8691643.html