我注意到Oracle数据库中存在一个奇怪的错误,因为我们正在从一个数据库(Oracle 11.2.0.3.0)迁移到另一个数据库(Oracle 11.2.4.0)。数据库服务器位于不同的数据中心,具有不同的操作系统和支持团队所以版本并不是唯一发生变化的东西。
所以,这是我面临的错误:当我执行这个小SQL语句时,我会得到不同的结果:
SELECT 'hello' FROM DUAL;
在旧数据库中,输出为:"hello"
在新数据库上,输出为:"hello "
这些空白来自哪里?
我在版本12.10.0.30中使用TOAD for Oracle。
我已检查过两个数据库的这些参数,但找不到任何差异(当然除了版本):
SELECT * FROM V$VERSION;
SELECT * FROM v$nls_parameters;
SELECT * FROM nls_session_parameters;
SELECT * FROM nls_instance_parameters;
SELECT * FROM nls_database_parameters;
然后我检查了这一点,发现没有差异:
DESC DUAL;
我做的下一个测试是:
SELECT dummy FROM DUAL;
两个数据库的结果是:X
下一个测试:
SELECT '|' || 'hello' || '|' FROM DUAL;
结果旧数据库:"|hello|"
结果新数据库:"|hello| "
另一个测试:
SELECT '|' || dummy || '|' || 'Hello' || '|' FROM DUAL;
SELECT '|' || dummy || '|' FROM DUAL;
SELECT '|' || 'Hello' || '|' FROM DUAL;
结果:
"|X|Hello|"
"|X|"
"|Hello| "
有趣的是,它适用于第一个SQL,但第三个SQL又填充了空格。
我已在运行的同一台笔记本电脑上安装了SQL * Plus 旧数据库:
SQL> select dummy from dual;
D
-
X
SQL> select 'dummy' from dual;
'DUMM
-----
dummy
SQL> SELECT dump('hello') FROM DUAL;
DUMP('HELLO')
---------------------------------
Typ=96 Len=5: 104,101,108,108,111
新数据库:
SQL> select dummy from dual;
D
-
X
SQL> select 'dummy' from dual;
'DUMMY'
--------------------------------
dummy
SQL> SELECT dump('hello') FROM DUAL;
DUMP('HELLO')
--------------------------------------------------------------------------------
Typ=96 Len=5: 104,101,108,108,111
数据库参数* .cursor_sharing是" EXACT"在旧数据库和" FORCE"在新数据库上。因此,我们必须将其更改为" EXCACT"太
答案 0 :(得分:1)
不知何故,文字字符串hello
被解释为CHAR(26)
数据类型(用空格填充,长度为26个字符)而不是VARCHAR2(4000)
数据类型。由于您是从DUAL
表中选择的,因此环境变量或您发出查询的工具必须是奇怪的。
答案 1 :(得分:0)
只是弄乱了这一点,发现如果你在客户端上搞乱NLS_LANG设置(从linux,对于windows来说可能是相同的)我会得到不同的结果(至少在显示时):
SQL>从双重选择'hello';
'HELL ----- hello
SQL>从双重选择'hello';
'HELLO' --------------- hello
我猜它与多字节字符集有关,但请注意两者的长度函数仍然返回5.
请检查您的新设置,确保您的NLS设置正确无误。
希望有所帮助。
修改强>:
我登录Oracle运行你的liveSQL测试,我没有得到你看到的间距。我想你下载后可能会在Excel中打开csv。我在一个文本编辑器(V)中打开并转储了你给出的可能有填充的示例的十六进制,但它没有:
00000000 27 7C 27 7C 7C 27 48 45 4C 4C 4F 27 7C 7C 27 7C '|'||'HELLO'||'|
00000010 27 0A 7C 68 65 6C 6C 6F 7C 0A '.|hello|.
上面的点是换行符(0A)。我找不到任何空白填充。
您的问题不可重现(至少不在我的环境或liveSQL中)。