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) 需用 SMALLINTBYTEA

二、常用函数 / 操作符差异

功能场景 SQL Server 语法 PostgreSQL 语法 兼容方案
字符串拼接 'a' + 'b' `'a'
取字符串长度 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 TABLEOUT 参数冲突 两者都是定义输出列的方式,不能同时使用)
布尔条件查询 isBoolean =1 isBoolean =true isBoolean ='true'
获取时间差函数 DATEIFF(YEAR,字段,GETDATE()) EXTARCT(YEAR FROM (CURRENT_DATE,字段))
WITH(NOLOCK) 有此方言 无此方言

三、特有函数兼容

特有函数多用cast和substring进行兼容转换