【问题标题】:Is it safe to add a new line charactor (\n) in the sql query?在 sql 查询中添加换行符 (\n) 是否安全?
【发布时间】:2016-03-02 07:27:53
【问题描述】:
StringBuilder sql = new StringBuilder();

        sql.append("SELECT C.ID,\n" +
                "    CODE\n" +
                "  FROM DB.TEATABLE C\n" +
                "  LEFT JOIN\n" +
                "    (SELECT IT.TEA,\n" +
                "      IT.COFFEETYPE,\n" +
                "      XREF.AUSTIN_COFFEE_LEAF_CODE AS LEAFCODE\n" +
                "    FROM DB.COFFEE_AUSTIN_XREF XREF,\n" +
                "      DB.INDIAPLAN TP,\n" +
                "      DB.COFFEE IT,\n" +
                "      DB.TEATABLE C\n" +
                "    WHERE C.ID            = IT.TEA\n" +
                "    AND IT.COFFEETYPE  = 'RIL'\n" +
                "    AND IT.INDIAPLANID   =TP.ID");
con     = getConnection();
pstmt   = con.prepareStatement(sql.toString());
rs      = pstmt.executeQuery();

我们曾经像上面一样添加新的行字符。在查询中(在 Oracle 中)添加 \n 字符是否安全?

【问题讨论】:

  • 为什么要添加它?没有意义
  • @Jens 可能是为了在控制台或日志文件中打印查询时进行格式化
  • 您使用的是 MySQL 还是 Oracle?不要标记未涉及的产品。
  • @jarlh ,它是甲骨文。我编辑了这个问题。很抱歉造成混乱。
  • 这很容易自己回答:这个查询是否失败:不安全;如果它没有失败,那么它是安全的。

标签: java sql oracle newline


【解决方案1】:

是的,在查询中添加换行符(\n\r\n)非常好。大多数解析器将换行符视为空格(就像空格或制表符一样),Oracle(以及我使用过的所有其他数据库)使用的换行符也是如此。

您已经证明了这一点,因为根据您的 cmets,您的公司已经这样做了(并且可能多年来一直如此)。我很好奇你为什么认为它可能不安全。因为显然它可以工作,而且如果它不安全,Oracle 将通过一个明确的错误来禁止它。

虽然非常主观,但总比不这样做要好,因为如果所有行都以空格结尾,它可以更容易地进行视觉检查。考虑以下之间的区别:

  1. 哎呀,没有空格

    "select *" +
    "from table"  
    
  2. 空格

    "select * " +
    "from table"
    
  3. 换行

    "select *\n" +
    "from table"
    

1 和 2 之间的差异小于 1 和 3 之间的差异。尤其是在长查询中,这可能很重要,看看您是否忘记了空格,这可能会导致语法错误,或者更糟的是导致不正确的查询行为。

另一方面,换行符是额外的视觉混乱,可能会分散阅读查询的注意力。如有疑问,请遵循贵公司的规范或代码风格。

【讨论】:

  • 谢谢马克。关于您的疑问“我很好奇您为什么认为它可能不安全。” -> 我不知道这是否会导致在不同版本中运行任何问题。你的回答很适合我。谢谢
【解决方案2】:

是的!但是请确保您的换行符实际上是换行符

我花了 3 个小时排除故障,以为这是我的 sql 语法 因为我用过:


String N = System.getProperty("line.seperator");

我以为我有一个换行符, 但我实际上是在我的语句中插入 nulls

包含的错误消息:

1:

org.postgresql.util.PSQLException: 
ERROR: syntax error at or near "NULLnull"

2:

org.postgresql.util.PSQLException: 
ERROR: conflicting NULL/NOT NULL declarations 
       for column "nullid" of table "t_1"

3:

org.postgresql.util.PSQLException: 
ERROR: syntax error at or near "KEYnull"

4:

org.postgresql.util.PSQLException: 
ERROR: syntax error at or near "null"

我以为我是我的主键语句:

id SERIAL PRIMARY KEY NOT NULL

比我想承认的要长。

【讨论】:

    猜你喜欢
    • 2010-09-24
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多