喵♂呜 的博客

一个刚毕业就当爹的程序猿 正在迷雾中寻找道路...

SqlServer迁移到PostgreSQL需要注意的问题

之前把SqlServer的数据迁移到PostgreSql由于语法或者函数不兼容的问题 所以需要转换

PgSql与SqlServer存在的差异

字段差异

SqlServerPostgresql
intinteger
varcharcharacter varying
nvarcharcharacter varying
datetimetimestamp without time zone
smallintsmallint
tinyintsmallint
nvarchar(MAX)text
ntexttext

函数差异

[]和””

SqlServer用[]来取消关键字
PostgreSql用””来取消关键字

TOP

SqlServer: SELECT TOP 1 * FROM XXX
PostgreSql: SELECT * FROM XXX LIMIT 1

CONVERT

SqlServer: SELECT CONVERT(varchar(7), NOW(), 120)
PostgreSql: SELECT SUBSTR(TO_CHAR(NOW(), 'yyyy-mm-dd hh24:mi:ss'),1,7)

ISNULL

SqlServer: SELECT ISNULL(null,'string')
PostgreSql: SELECT COALESCE(null,'string')

注意: COALESCE 需要默认值与字段值相匹配 可以通过::进行类型类型转换 例如 SELECT COALESCE(money, 0.0::money)

CAST

CAST的用法是一样的 但是要注意字段类型 字段差异
比如 datatime 在PostgreSql是不存在的需要改成 TIMESTAMP WITHOUT TIME ZONE
SqlServer: SELECT CAST('2016-11-11 11:11:11' AS DATATIME)
PostgreSql: SELECT CAST('2016-11-11 11:11:11' AS TIMESTAMP WITHOUT TIME ZONE)

SQL语法差异

类型转换

SqlServer: 在某些情况下可以自动进行转换 或者用 CAST
PostgreSql: 在某些情况下可以自动进行转换 或者用 CAST 和 :: CAST(0.0,money) 等价于 0.0::money

跨库处理

如果在SqlServer用到了跨库 迁移过程中可以通过下列两种方式处理

-. 使用FDW(远程数据封装)
-. 把另外一个数据库也迁移到Postgresql