Skip to content

方言检测

当不指定 --language 时,dbsqlfmt 使用加权评分算法自动识别 SQL 方言。

算法原理

对输入的 SQL 文本分别计算 MySQL 和 PostgreSQL 两组模式的权重总和,得分高的方言胜出。平局默认走 MySQL。

mysqlScore = Σ(匹配模式的权重)
pgScore   = Σ(匹配模式的权重)

if mysqlScore > pgScore → mysql
if pgScore > mysqlScore → postgresql
else → mysql(平局默认)

MySQL 检测模式

模式权重说明
`ident`5反引号标识符
AUTO_INCREMENT5自增列
ON DUPLICATE KEY UPDATE5重复键更新
ENGINE=5存储引擎
REPLACE INTO5替换插入
# 行注释3MySQL 特有的行注释语法
INT(N)3显示宽度语法
UNSIGNED3无符号类型
CHARACTER SET / CHARSET3字符集
FULLTEXT3全文索引
SPATIAL3空间索引
ROW_FORMAT3行格式
LOCK TABLES / UNLOCK TABLES3表锁
STRAIGHT_JOIN3强制连接顺序
SQL_CALC_FOUND_ROWS3计算行数
SHOW ...3SHOW 语句
DESCRIBE3描述表结构
DELAYED2延迟插入
TINYINT / MEDIUMINT / SMALLINT / BIGINT1整数类型

PostgreSQL 检测模式

模式权重说明
::type5类型转换
ILIKE5不区分大小写的 LIKE
SERIAL / BIGSERIAL / SMALLSERIAL5自增序列
RETURNING5返回子句
ARRAY[...]5数组字面量
$$5美元符字符串
ON CONFLICT4UPSERT
DISTINCT ON4去重排序
TABLESPACE3表空间
CONCURRENTLY3并发索引
NOWAIT3不等待锁
SKIP LOCKED3跳过已锁
EXCLUDE USING3排除约束
GENERATED ... AS IDENTITY4标识列
CITEXT3不区分大小写的文本类型
JSONB3二进制 JSON
XML2XML 类型
BOOLEAN2布尔类型

强制指定方言

如果自动检测结果不满足需求,可以显式指定方言:

bash
dbsqlfmt format query.sql --language postgresql

显式传入后跳过自动检测。

MIT 许可证