【问题标题】:Not understanding with "end of line" character不理解“行尾”字符
【发布时间】:2014-07-29 03:21:50
【问题描述】:
WITH t AS (
SELECT 'aaa
bbb' AS val FROM DUAL
)
SELECT val from t

此查询的结果是:

VAL    
-----
aaabbb

什么对我来说很清楚。

但是这个:

WITH t AS (
SELECT 'aaa
bbb' AS val FROM DUAL
)
SELECT val, replace(val, 'a', '-') AS replace from t;

返回:

VAL    |REPLACE
---------------------
aaa bbb| ---bbb

问题:在第二个示例中,VAL 列中aaabbb 之间的空格是从哪里出现的?

附:我在 SQLDeveloper(版本 4.0.2.15)中对此进行了测试

更新

不仅replace 会导致该错误,此查询还会:

WITH t AS (
SELECT 'aaa
bbb' AS val FROM DUAL
)
SELECT val   ---------
from t; 

结果是:aaa bbb

如果删除评论破折号,结果是没有空格。

【问题讨论】:

  • 非常有趣和奇怪,可能是一个错误。在 Oracle 11.2.0.2.0 中重现。你是哪个版本的?
  • 我有12.1.0.1.0版本

标签: oracle character oracle-sqldeveloper oracle12c


【解决方案1】:

看起来它可能是一个错误。我在 11.2.0.2.0 中复制了它。对replace 的调用似乎对插入空格字符的val 的值触发了某种副作用:

WITH t AS (
SELECT 'aaa
bbb' AS val FROM DUAL
)
SELECT val, dump(val) from t;

"aaabbb"    Typ=96 Len=7: 97,97,97,10,98,98,98

WITH t AS (
SELECT 'aaa
bbb' AS val FROM DUAL
)
SELECT val, replace(val, 'a', '-'), dump(val) AS replace from t;

"aaa bbb"   "--- bbb"   Typ=96 Len=8: 97,97,97,32,10,98,98,98

请注意,换行符在 val 的原始值中。在调用replace 的查询中,可能存在导致val 的值以某种方式转换导致插入空格的错误。

编辑:根据 jonearles 的评论,这似乎是 SQL Developer 4.0 中的一个错误。当我在另一个工具(例如 Apex)中运行这些时,问题不会发生。

【讨论】:

  • 是的,有问题,不仅replace会导致这种奇怪的情况,例如这个查询也插入了空格:请查看有问题的更新
  • 当主查询不仅仅查询基础val 时,似乎某种转换已经完成(或没有完成)。我想知道如果val 是绑定变量而不是文字字符串,是否会发生这种情况?
  • 这看起来像是 SQL Developer 4.0 中的一个错误。在 Oracle 12c 上的 SQL Developer 3.2.20.09 中一切正常,但在 Oracle 12c 上的 SQL Developer 4.0.2.15 上却中断了。
  • 感谢 jonearles,已确认。已更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 2014-07-10
  • 2010-09-09
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多