在 sql 查询中添加换行符 (\n) 是否安全?

Is it safe to add a new line charactor (\n) in the sql query?

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();

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

是的,在您的查询中添加换行符(\n\r\n)完全没问题。大多数解析器将换行符视为白色 space(就像 space 或制表符),Oracle 使用的换行符(以及我使用过的所有其他数据库)也是如此。

您已经证明了这一点,因为根据您的评论,您的公司已经这样做了(并且可能已经这样做多年)。我很好奇你为什么认为它可能不安全。因为它显然有效,如果它不安全,Oracle 会以明确的错误禁止它。

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

  1. 糟糕,没有space

    "select *" +
    "from table"  
    
  2. Space

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

    "select *\n" +
    "from table"
    

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

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

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

我花了 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

时间比我承认的要长。