【问题标题】:Can I escape double quotes in column titles with Oracle?我可以使用 Oracle 转义列标题中的双引号吗?
【发布时间】:2023-04-01 20:46:01
【问题描述】:

用双引号创建一个表来转义真正的双引号在 Oracle 的 SQL 语法中似乎不起作用:

CREATE TABLE "MyTable" (
"Col""umn 1" varchar(168)
);

上述失败。有什么办法可以逃脱双引号使 'Col"umn 1'?

【问题讨论】:

  • 我猜我们不能创建包含"的列名。
  • 你到底为什么要这么做?
  • 你到底为什么要这样做?除非您鄙视必须查询此表的每个人,否则我认为没有充分的理由!
  • @a_horse_with_no_name 他想有问题,我想:D
  • 我不想,但其他人可能会。

标签: sql database oracle header escaping


【解决方案1】:

你不能。 根据documentation

不带引号的标识符只能包含以下字母数字字符 您的数据库字符集和下划线 (_)、美元符号 ($)、 和井号 (#)。数据库链接也可以包含句点 (.) 和 “at”符号 (@)。 Oracle 强烈建议您不要在其中使用 $ 和 # 不带引号的标识符。

带引号的标识符可以包含任何字符和标点符号 以及空格。但是,无论是带引号的还是不带引号的标识符 可以包含双引号或空字符 (\0)。

【讨论】:

  • 在某些情况下,在标识符中使用引号(我的意思是 ASCII 34,而不是 Unicode 风格)是不可能的。例如,如果您维护一些类似元数据的系统,其中存储了函数参数名称和返回值,您可以在包含引号的辅助名称下注册返回值,例如"return"。然后,您可以确定攻击者无法使用像 ""return"" 这样的混淆参数使系统创建函数崩溃,因为 Oracle 不允许她这样做。
【解决方案2】:

你当然可以使用 unicode!

SELECT
    1 "“Unicode Rocks”",
    2 "ʺSooo cooolʺ",
    3 ""My co-workers love me""
FROM DUAL

【讨论】:

    【解决方案3】:

    也许这会有所帮助...但请不要创建包含此类列的表:

    CREATE TABLE DropMe AS
    SELECT rpad('X', 168, ' ') "Col''umn1" FROM dual
    /
    
    SELECT * FROM DropMe
    /
    
    SQL>
    
    Col"umn1
    -------------------------------------.....
    X           
    

    【讨论】:

    • 这会产生两个撇号而不是引号(ASCII 代码 34):可以通过查询 select length(column_name) from all_tab_cols where table_name = 'DROPME'(结果 9)或类似的方式轻松验证。
    猜你喜欢
    • 2017-04-16
    • 1970-01-01
    • 2020-11-26
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多