# 方言差异

ts-grm 的核心从不写死 SQL 方言：**driver 上报自己的能力，SQL 生成按能力分支**。因此同一条查询在六种数据库上生成不同但等价的 SQL。

## 分页差异：paginationStrategy

驱动声明自己的分页策略，切片（`fetchPage/fetchRange`）据此生成：

| 策略 | 形态 | 适用 |
|---|---|---|
| `STANDARD_OFFSET_FETCH` | `LIMIT x OFFSET y`（PG/MySQL/SQLite）或 `OFFSET y ROWS FETCH NEXT x ROWS ONLY`（SQL Server 2012+） | 大多数现代库 |
| 专用策略 | 兜底（Oracle 的 `ROWNUM` 包装、旧版 SQL Server 的 `ROW_NUMBER() over(...)`） | 老版本数据库 |

对应驱动动了手：上游测试里 `SqlServer2012Driver` 返回 `STANDARD_OFFSET_FETCH`；`OracleDriver / SqlServerDriver` 走各自兼容路径（驱动测试文件 `oracle_12.test.ts` / `sqlserver_2012.test.ts` 覆盖）。

## 其它常见差异面

- **保留字与大小写**：驱动决定引用策略（`keywordStrategy`）；PostgreSQL 未引号标识符会小写化——命名策略产出大写列名时由驱动/引用规则兜底；
- **日期时间**：`prop.dt()` 的序列化形态随驱动调整（Oracle 测试中有 `TIMESTAMP '...'` 转换逻辑）；
- **布尔/数值**：SQL Server 的 true/false 字面量、MySQL 的引号风格等，在驱动测试里都有专属转换（`useSqlServerClientWithData` 等）；
- **无序分页**：部分驱动不支持无排序分页（`isUnorderedPaginationSupported`），构建时可禁用以提前报错（`isUnorderedPaginationDisabled`）。

## 在本教程里怎么看

沙盒跑 PostgreSQL：你实际看到的 SQL 就是 PG 方言。想对比方言形态，可直接参考上游各驱动测试的 SQL 断言（链接见[「认识 ts-grm」](../about/welcome)）。

## 写给跨库项目

- **先定 driver，再写查询**：行为差异尽量收敛到 driver 层，业务代码不感知方言；
- **`dsl.native` 无法跨库**：原生片段绑死当前方言，跨库时移入策略层或避免；
- 事务/日志/模式创建等能力六库通用（非系统表查询差异由驱动内部处理）。
