在 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。考虑两者之间的区别:
糟糕,没有space
"select *" +
"from table"
Space
"select * " +
"from table"
换行符
"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
时间比我承认的要长。
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。考虑两者之间的区别:
糟糕,没有space
"select *" + "from table"
Space
"select * " + "from table"
换行符
"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
时间比我承认的要长。