我目前正在将一个C-application从RdB(OpenVMS)迁移到Oracle 11(Linux)。我现在偶然发现了两个数据库系统之间的差异。
示例:
create table MYTAB(id number(13), name varchar2(10)) ;
内容
Id Name
1 Smith
2 Smith<blank> // trailing blank after Smith
当我在嵌入式SQL中选择名称时,Oracle会将尾随空格添加到我的宿主变量的长度,即无法区分这两个名称。 即使我TRIM这个名字,Oracle也会添加空格。
但是按列名称选择_语句我必须给出确切的空格数:
select id from MYTAB where name ='Smith' -> gives Id 1
select id from MYTAB where name ='Smith ' -> gives Id 2
这使我很难处理数据,因为我无法区分select语句中的尾随空格数。
有没有办法阻止Oracle填空?
提前多多感谢 约尔格
答案 0 :(得分:1)
我想我自己找到了一个解决方案。如果我将选项CHAR_MAP = STRING添加到预编译器调用,则选择VARCHAR2列的嵌入式SQL调用不会用空格填充我的字符串。有了这个,我可以解决我的问题。
祝你好运 约尔格
答案 1 :(得分:0)
如果你有CHAR(),那么你的字段有VARCHAR2(),它不会导致任何空白填充。
在insert语句中,您需要在插入之前TRIM()值。听起来你转换成表格是不正确的。
在您选择的时候,您应该能够......
select id from MYTAB where trim(name) ='Smith'
此外,当您开始在where子句上使用TRIM()等函数时,它可能导致Oracle执行表扫描并忽略索引。