Liquibase定义numeric(20,5)字段,PostgreSQL创建时变为number的问题
问题描述
我有一个连接PostgreSQL数据库的Spring应用,遇到如下问题:在Liquibase脚本中定义了如下字段:
<column name="utmx" type="numeric(20, 5)"> <constraints nullable="true"/> </column> <column name="utmy" type="numeric(20, 5)"> <constraints nullable="true"/> </column>
但实际执行创建表时,SQL语句变为:
CREATE TABLE PUBLIC.table (... utmx NUMBER(20, 5), utmy NUMBER(20, 5)...
可以看到字段类型从NUMERIC被改为NUMBER,请问这是什么原因?该如何解决?
原因分析
这是Liquibase的数据库类型映射机制导致的:
- Liquibase为适配不同数据库的SQL语法,会将通用类型名称转换为目标数据库支持的等价类型。
- 在PostgreSQL中,
NUMERIC和NUMBER是完全等价的别名,官方文档明确说明NUMBER是NUMERIC的同义词,两者功能、存储逻辑完全一致。 - Liquibase的PostgreSQL适配模块会自动对类型名称做转换,但本质上不会影响数据库的实际行为。
解决方法
如果只是在意类型名称的显示,完全不需要处理——PostgreSQL中NUMERIC和NUMBER没有任何功能差异,不会影响数据存储或查询。
如果一定要让生成的SQL显示为NUMERIC,可以通过两种方式处理:
- 指定数据库专属类型:在Liquibase脚本中用
dbms属性限定仅针对PostgreSQL使用NUMERIC,写法如下:
<column name="utmx" type="NUMERIC(20, 5)" dbms="postgresql"> <constraints nullable="true"/> </column>
- 自定义类型映射:在Liquibase配置中添加自定义类型映射,覆盖默认转换规则。比如在
liquibase.properties中添加:
liquibase.database.typeMappings.numeric=NUMERIC
不过这种方式通常没必要,因为两种类型本质等价。
内容的提问来源于stack exchange,提问作者StzEZ
相关产品推荐
相关产品推荐

