druid SQLUtils.format 在格式化之后丢失转义符 可能导致sql执行失败

a0x5cqrl  于 2022-11-02  发布在  Druid
关注(0)|答案(4)|浏览(378)

Druid版本:1.1.4
例子1:

String sql = "insert into test values('a\\\"','b\\n')";
 sql = SQLUtils.format(sql, JdbcConstants.MYSQL,new SQLUtils.FormatOption(VisitorFeature.OutputUseInsertValueClauseOriginalString));
System.err.println(sql);

希望得到的输出: insert into test values('a\"','b\n')
实际的输出:

insert into test values ('a"', 'b
')

例子2:

String sql = "insert into test values(?,?)";
        List<Object> list = new ArrayList<>();
        list.add("a\\\"");
        list.add("b\\n");
        sql = SQLUtils.format(sql, JdbcConstants.MYSQL,list);
        System.err.println(sql);

希望得到的输出: insert into test values('a\\\"','b\\n')
实际的输出:

INSERT INTO test
VALUES ('a\\"', 'b\\n')

以上两个例子中 格式化之后的第一个参数应该都少了一个反斜杠

q8l4jmvw

q8l4jmvw1#

@wenshao 哪位大佬能看下

j2datikz

j2datikz2#

1.1.20的版本也有这个问题。。

gojuced7

gojuced73#

首先

String sql = "insert into test values('a\\\"','b\\n')";

在JAVA String中会先转义一次 实际上在 lexertext 中是

insert into test values('a\"','b\n')

\"dbTypeMySQL的时候会被转义 为 "

个人愚见

yvfmudvl

yvfmudvl4#

首先

String sql = "insert into test values('a\\\"','b\\n')";

在JAVA String中会先转义一次 实际上在 lexertext 中是

insert into test values('a\"','b\n')

\"dbTypeMySQL的时候会被转义 为 "

个人愚见

嗯 你说得很有道理。。但是这还是一个问题

如果上述的sql我是作为参数入库的话
参数为 insert into test values('a\"','b\n')
在不用druid做任何处理的情况下我能将他完整的插入数据库
但是经过druid处理之后就变成了

insert into test values('a"','b
')

当我这个参数为json的情况下甚至会抛出MysqlDataTruncation: Data truncation: Invalid JSON text

相关问题