MySQL中查表名含下划线的表需转义下划线,正确写法为:SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_db_name' AND TABLE_NAME LIKE '%\_%' ESCAPE '\';

MySQL 中查表名含下划线的表:用 INFORMATION_SCHEMA.TABLES
MySQL 不支持直接用 LIKE '%_%' 查下划线,因为 _ 是通配符(匹配任意单字符)。必须转义才能当字面量用。
- 正确写法是加
ESCAPE指定转义符,比如LIKE '%\_%' ESCAPE '\' - 或者用
REGEXP:例如TABLE_NAME REGEXP '_'(注意这会匹配任意位置的下划线) - 查询语句示例:
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'your_db_name' AND TABLE_NAME LIKE '%\_%' ESCAPE '\';
- 漏掉
TABLE_SCHEMA条件会扫全实例,慢且可能权限不足
PostgreSQL 怎么查带下划线的表:用 pg_tables 或 pg_class
PostgreSQL 的 pg_tables 视图更友好,tablename 列直接可用,且默认不区分大小写但下划线是普通字符,无需转义。
- 简单查法:
SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename LIKE '%_%';
- 如果要用系统目录更底层控制(比如查所有 schema),得用
pg_class+pg_namespace关联,此时relname对应表名,仍可直接LIKE '%_%' - 注意:PostgreSQL 中双引号包裹的标识符(如
"my_table")在pg_tables里显示为小写,除非建表时用了双引号且含大写/特殊字符
SQL Server 查询含下划线的表名:sys.tables 配合 LIKE 转义
SQL Server 的 LIKE 默认也把 _ 当通配符,但转义方式和 MySQL 不同——它支持方括号语法或自定义转义符。
- 推荐用方括号:
name LIKE '%[_]%'(这是最安全、不依赖 ESCAPE 子句的方式) - 等价写法:
name LIKE '%\_%' ESCAPE '\',但需确保连接字符串或 SET 选项未禁用转义 - 查询示例:
SELECT name FROM sys.tables WHERE name LIKE '%[_]%' AND type = 'U';
-
type = 'U'很关键,否则会混入系统表、临时表等
跨数据库通用思路:为什么别硬记转义规则
不同数据库对 _ 的处理逻辑表面相似,实则细节差异大:MySQL 严格依赖 ESCAPE,PostgreSQL 基本不用转,SQL Server 支持多种写法但行为受兼容级别影响。
- 真正稳的方案是先查出所有表名(限制 schema 和类型),再用应用层过滤,比如 Python 里
[t for t in tables if '_' in t] - 如果必须 SQL 内完成,优先选正则(
REGEXP/~/LIKE_REGEX)——但注意 PostgreSQL 12+ 才原生支持LIKE_REGEX,旧版仍得用~ - 最容易被忽略的是 schema 过滤。没加
TABLE_SCHEMA、schemaname或schema_id条件,轻则慢,重则返回空或报错(如权限不足访问INFORMATION_SCHEMA)










