sqlsever的sql转postgresql的sql的方言差异
一、数据类型映射差异
可以使用KDTS将SQL Server数据库迁移至PG
SQL Server 类型 | PostgreSQL 对应类型 | 说明 |
---|---|---|
VARCHAR(n) | VARCHAR(n) / TEXT | PostgreSQL 中 VARCHAR(n) 无性能损耗,TEXT 等效于 VARCHAR(无限制) |
NVARCHAR(n) | VARCHAR(n) | PostgreSQL 默认 UTF-8 编码,无需区分 VARCHAR /NVARCHAR |
DATETIME | TIMESTAMP | 存储日期 + 时间,PostgreSQL TIMESTAMP 无 SQL Server 的精度限制 |
DATETIME2(n) | TIMESTAMP(n) | 支持自定义精度(如 TIMESTAMP(3) 对应毫秒级) |
BIT | BOOLEAN / SMALLINT | BIT(1) 对应 BOOLEAN ,多值 BIT(n) 需用 SMALLINT 或 BYTEA |
二、常用函数 / 操作符差异
功能场景 | SQL Server 语法 | PostgreSQL 语法 | 兼容方案 |
---|---|---|---|
字符串拼接 | 'a' + 'b' | 'a'||'b' | CONCAT('a','b')` |
取字符串长度 | LEN('test') | LENGTH('test') | |
日期格式化 | FORMAT(GETDATE(), 'yyyy-MM-dd') | TO_CHAR(CURRENT_TIMESTAMP, 'YYYY-MM-DD') | |
获取当前时间 | GETDATE() / SYSDATETIME() | CURRENT_TIMESTAMP / NOW() | |
空值处理(替换) | ISNULL(col, '默认值') | COALESCE(col, '默认值') | |
分页(TOP/LIMIT) | SELECT TOP 10 * FROM t | SELECT * FROM t LIMIT 10 | LIMIT 5 OFFSET 10 |
分页(OFFSET) | OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY | LIMIT 5 OFFSET 10 | LIMIT 5 OFFSET 10 |
删除数据 | delete table(支持) | delete from table | delete from table |
存储过程与函数 | 存储过程用 CREATE PROCEDURE | CREATE FUNCTION (推荐用函数)(其中:RETURNS TABLE 和 OUT 参数冲突两者都是定义输出列的方式,不能同时使用) | |
布尔条件查询 | isBoolean =1 | isBoolean =true | isBoolean ='true' |
获取时间差函数 | DATEIFF(YEAR,字段,GETDATE()) | EXTARCT(YEAR FROM (CURRENT_DATE,字段)) | |
WITH(NOLOCK) | 有此方言 | 无此方言 |
三、特有函数兼容
特有函数多用cast和substring进行兼容转换