重點注意Delphi和Oracle-SQL中比較字符串時空字符串''的根本性的不同
Delphi中的字符串比較
Delphi中字符串比較大小的規則:對應位置的字符按照字符編碼值逐個對比,直到遇到可以確定大小關系的就結束比較
參考《Delphi的Ord函數和ASCII碼對照表》
-
常見的一些字符的字符編碼
'0'對應字符編碼48;'1'對應字符編碼49。'2'、'3'、……、'9'依次遞增
'A'對應字符編碼65。'B'、'C'、……'Y'、'Z'依次遞增
'a'對應字符編碼97。'b'、'c'、……'y'、'z'依次遞增
' '對應字符編碼32,注意是空格,而不是空字符串
-
比如'abcd' 和 'abd'比較
首先第一位'a'和'a'比較,一樣,繼續下面的比較
接著第二位'b'和'b'比較,一樣,繼續下面的比較
接著第三位'c'和'd'比較,'c'<'d',所以'abcd'<'abd',結果出來!比較結束
-
列舉出常見的比較
'101'<'12'為True
'101'<'102'為True
'abcd'>'abc'為True,這個需要注意
'12345'>'1234'為True,這個需要注意
'1'>'',在Delphi中任意非空字符串都大于空字符串''
可以自己在Delphi中編程試一下
procedure TForm1.btn1Click(Sender: TObject);
begin
//這里面的四種比較都是True,所以都會彈出框if '123'>'12' thenShowMessage(' ''123''>''12'' ');if 'abcd'>'abc' thenShowMessage(' ''abcd''>''abc'' ');if '1'>'' thenShowMessage(' ''1''>'''' ');if '102'>'10' thenShowMessage(' ''102''>''10'' ');
end;
Oracle SQL中的字符串比較
親自在Oracle中驗證過!
一般在SQL中的where條件中會用到字符串的比較,比如select * from user where name > 'john'
-
首先特別注意'',和Delphi有一個很大的不同
任何字符串都不能和''進行比較,因為比較結果既不為True也不為False
如果在select的where判斷中有和''的比較會導致選不出任何一條記錄
除了小心''之外,其余同Delphi:對應位置的字符按照字符編碼值逐個對比,直到遇到可以確定大小關系的就結束比較
-
幾種常見的字符對應的編碼
select ascii('1') from dual; 字符編碼值 49
select ascii('A') from dual; 字符編碼值 65
select ascii('a') from dual; 字符編碼值 97
select ascii(' ') from dual; 字符編碼值 32
-
列舉出常見的比較
'abcd'>'abc'為True,和Delphi中一樣
'12345'>'1234'為True,和Delphi中一樣
其他的數據庫的相關規則目前還沒有試過,比如MySQL、SQLite……