如何在MySQL单查询中去除Schema/数据库名的单引号以构建合法查询?
问题解答
首先明确:没法直接在FROM子句里用TRIM或REPLACE这类函数来替换Schema名称。原因是MySQL解析SQL时,会先识别库名、表名这类标识符,而函数的计算结果属于运行时才会得到的值,解析器不会把它当成合法的标识符处理——你要是直接写SELECT field FROM TRIM(...) .sometable,MySQL会直接报语法错误。
不过有个符合你要求的方案:用预处理语句(Prepared Statement),不需要存储过程,用一条语句序列就能完成,代码如下:
SET @quoted_schema = '''somedatabasename'''; SET @clean_schema = TRIM(BOTH '''' FROM @quoted_schema); SET @sql = CONCAT('SELECT field FROM `', @clean_schema, '`.sometable'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
步骤说明:
- 定义变量
@quoted_schema,模拟应用传递的带单引号的Schema名称 - 用
TRIM(BOTH '''' FROM @quoted_schema)去掉字符串首尾的单引号,得到干净的Schema名 - 用
CONCAT拼接出合法的查询语句,给Schema名加上反引号`,避免特殊字符引发的问题 - 通过预处理语句执行拼接好的SQL,绕开MySQL对标识符的解析限制
内容的提问来源于stack exchange,提问作者yodellingbutters
相关产品推荐
相关产品推荐

