下面是關於Oracle PL/SQL中字符串比較的問題。我正在測試一些涉及空白填充和非空白填充比較的簡單片段,我遇到了一個特殊情況,我無法得到PL/SQL引擎正在做什麼。有關字符串文字的Oracle PL/SQL字符串比較:意外的結果
這裏是我的代碼(我運行在Oracle 12c的這個腳本)
set serveroutput on;
declare
l_char1 char(35) := 'Hello';
l_char2 char(30) := 'Hello ';
l_varchar21 varchar2(35) := 'Hello';
l_varchar22 varchar2(35) := 'Hello ';
begin
/* When a comparison is made between variables of type CHAR,
a blank-padding comparison takes place. */
if (l_char1 = l_char2) then
dbms_output.put_line('First comparison is TRUE');
else
dbms_output.put_line('First comparison is FALSE');
end if;
/* When at least one of the involved variables is a VARCHAR2,
then a non-blank-padding comparison takes place. None of the
variables involved in the comparison is then modified. */
if (l_char1 = l_varchar21) then
dbms_output.put_line('Second comparison is TRUE');
else
dbms_output.put_line('Second comparison is FALSE');
end if;
/* yet another non-blank-padding comparison */
if (l_varchar21 = l_varchar22) then
dbms_output.put_line('Third comparison is TRUE');
else
dbms_output.put_line('Third comparison is FALSE');
end if;
/* Strange behaviour: I supposed both string literals to be
treated as VARCHAR2, so I expected to get FALSE. */
if ('MP' = 'MP ') then
dbms_output.put_line('Fourth comparison is TRUE');
else
dbms_output.put_line('Fourth comparison is FALSE');
end if;
end;
下面是輸出
Procedura PL/SQL completata correttamente.
First comparison is TRUE
Second comparison is FALSE
Third comparison is FALSE
Fourth comparison is TRUE ** I expected FALSE **
關於字符串常量比較,我希望得到什麼報道甲骨文documentation;我引用了關鍵句:
結尾空格的字符串中顯著,所以「ABC」和「ABC」是不同的。在PL/SQL處理過程中,字符串文字中的尾隨空白不會被修剪,儘管如果您將該值插入到CHAR類型的表格列中,它們會被修剪。有關其他信息,包括NCHAR字符串文字,請參閱「字符串文字」。
任何想法來解釋我發現什麼?這可能取決於我的Oracle環境/會話中的特定設置嗎?
我得出了相同的結論空間,但如何從Oracle文檔報價補齊?我是否誤解了他們的意思,或者錯誤是要修復的? – Max
http://docs.oracle.com/cd/B14117_01/server.101/b10759/sql_elements002.htm '空白填充比較語義 如果這兩個值的長度不同,那麼Oracle首先會將空白添加到較短的一個,所以它們的長度相等。 ....只有當比較中的兩個值都是數據類型CHAR,NCHAR,文本字面值的表達式時,Oracle才使用空白填充的比較語義......' – are