Delphi中字串比較大小 VS Oracle-SQL中字串比較大小

xumenger發表於2016-04-14

重點注意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` then
    ShowMessage(` ``123``>``12`` `);
  if `abcd`>`abc` then
    ShowMessage(` ``abcd``>``abc`` `);
  if `1`>`` then
    ShowMessage(` ``1``>```` `);
  if `102`>`10` then
    ShowMessage(` ``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……

相關文章