varchar,char,varchar2,mybatis查詢無返回


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM