mysql - 使用 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 服务器配置来决定我们是否需要转义特殊字符?
解决方案
您可能在谈论LIKE
运营商
如果您使用以下谓词进行匹配my_test
where GRANTEE like 'my_test'
你会匹配my_test
但也myztest
或my2test
因为下划线匹配任何单个字符。
只匹配my_test
你需要转义它
where GRANTEE like 'my@_test' escape '@'
所以你必须转义下划线字符,但前提是你使用 LIKE
- 不需要在相等谓词中转义。
这是一个纯粹的数据库功能,与 JDBC 唯一的小相关性
java.sql.DatabaseMetaData
是只有当您处于争取数据库独立性的不幸位置时才可能必须使用的接口
例如,要以 DB 独立方式获取表列表(对于您要查询的 Oracle ALL_TABLES
),您必须
- 获取接口 DatabaseMetaData和
- 询问驱动器诡计的转义字符
.
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
推荐阅读
- ruby-on-rails - Rails - 包含一个模块而不使用包含这个词
- mysql - 使用 node.js MySQL 连接 ECONNREFUSED 仍然出现错误
- javascript - 在Javascript中将TZ日期格式转换为“dd/mm/yy hh:mm:ss”
- python - 如何将高度和宽度传递给 imagekit 模板标签?
- javascript - 如何在 React native 中显示包含用逗号分隔的图像 url 列表的字符串中的单个图像
- linux - 如何使用 Inotifywait 跟踪文件更改中的序列
- plotly - Plotly/Dash:如何防止动态插入的链接/元素在没有用户点击的情况下自动触发回调?
- jquery - TypeError:在使用 Jquery 数据表时,无法在 blazor clinet 应用程序中读取 null 的属性“removeChild”
- python - 在 plt.bar 中对值进行排序
- android - 检查广播接收器是否工作