首页 > 解决方案 > 使用 JDBC 准备语句查询 MySQL 时是否需要转义下划线?

问题描述

我使用 SQL 查询 MySQL 信息架构如下:

select * from INFORMATION_SCHEMA.SCHEMA_PRIVILEGES where GRANTEE=? AND TABLE_SCHEMA= ?

我的java代码片段是:

try (Connection connection = dataSource.getConnection();
     PreparedStatement statement = connection.prepareStatement(sql)) {
     statement.setString(1, "'" + user + "'@'%'");
     statement.setString(2, schema);
     ## ignore some not related code....
}

我的架构名称是“my_test”。我发现有时我需要添加下划线才能得到结果。我记不清详细信息了。我只有一些模糊的记忆,我遇到过我必须在换行符下添加以使代码工作的情况。现在我无法重现它。有时我不需要转义下划线来获得结果。现在可以转载了。如果我添加转义将导致返回结果为空。是否有任何 MySQL 服务器配置来决定我们是否需要转义特殊字符?

标签: mysqljdbc

解决方案


您可能在谈论LIKE运营商

如果您使用以下谓词进行匹配my_test

where GRANTEE like 'my_test'

你会匹配my_test但也myztestmy2test

因为下划线匹配任何单个字符。

只匹配my_test 你需要转义它

where GRANTEE like 'my@_test' escape '@'

所以你必须转义下划线字符,但前提是你使用 LIKE- 不需要在相等谓词中转义。

这是一个纯粹的数据库功能,与 JDBC 唯一的小相关性 java.sql.DatabaseMetaData是只有当您处于争取数据库独立性的不幸位置时才可能必须使用的接口

例如,要以 DB 独立方式获取表列表(对于您要查询的 Oracle ALL_TABLES),您必须

.

md = con.getMetaData()
esc = md.getSearchStringEscape() 

对于我的 Oracle 驱动程序 12.1.0.2.0,我得到转义字符为/

所以现在询问带有模式的表格列表my_test

md.getTables(null,null,'my_test',null)

我明白了

my_test
myztest
my2test

但使用转义模式 my/_test

md.getTables(null,null,'my/_test',null)

我只得到

my_test

推荐阅读