下面是关于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