Liquibase高阶使用

Liquibase的核心就是存储变化的XML。

 

目录

  • 一、依赖和配置
  • 二、xml常用标签
  • 三、Liquibase类型字典

 

一、依赖和配置

1.1.依赖

1         <!--liquibase-->
2         <dependency>
3             <groupId>org.liquibase</groupId>
4             <artifactId>liquibase-core</artifactId>
5             <version>4.0.0</version>
6         </dependency>

 

1.2.配置

只要依赖了 liquibase-core 默认可以不用做任何配置。如果我们用xml文件,则要修改change-log信息

# spring.liquibase.enabled=true
# spring.liquibase.change-log=classpath:/db/changelog/db.changelog-master.yaml
spring.liquibase.change-log=classpath:/db/master.xml

 

如果用yaml方式(这篇博客主要介绍的是xml方式,此处yaml可以跳过不看):我们新建一个同名yaml文件,放在默认的路径下,则已经完成了基本的配置,启动后会自动使用这里的内容。

databaseChangeLog:
  # 支持 yaml 格式的 SQL 语法
  - changeSet:
      id: 1
      author: Levin
      changes:
        - createTable:
            tableName: person
            columns:
              - column:
                  name: id
                  type: int
                  autoIncrement: true
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: first_name
                  type: varchar(255)
                  constraints:
                    nullable: false
              - column:
                  name: last_name
                  type: varchar(255)
                  constraints:
                    nullable: false
​
  - changeSet:
      id: 2
      author: Levin
      changes:
        - insert:
            tableName: person
            columns:
              - column:
                  name: first_name
                  value: Marcel
              - column:
                  name: last_name
                  value: Overdijk
  # 同时也支持依赖外部SQL文件(TODO 个人比较喜欢这种)
  - changeSet:
      id: 3
      author: Levin
      changes:
        - sqlFile:
            encoding: utf8
            path: classpath:db/changelog/sqlfile/test1.sql

test1.sql

INSERT INTO person (id, first_name, last_name) VALUES ('2', '哈哈', '呵呵');

 

二、xml常用标签

2.1.databaseChangeLog标签

liquibase的入口文件,这个标签可以引入你的版本修改文件。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <databaseChangeLog
 3     xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
 6     xmlns:pro="http://www.liquibase.org/xml/ns/pro"
 7     xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd
 8     http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd
 9     http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.8.xsd ">
10 </databaseChangeLog>

 

 

2.2.databaseChangeLog的子标签

tagDescription
preConditions 执行sql变更文件的前置条件
property 设置的属性的值
changeSet 要执行的更改
include 包含要执行的更改集的附加文件
context 上下文将被附加到(使用AND)所有变更集

 

2.2.1.preConditions标签

可以应用于<databaseChangeLog>标签或者<changeSet>标签。 示例:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2  3 <databaseChangeLog
 4   xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
 5   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
 7          http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
 8     <preConditions>
 9         <dbms type="oracle" />
10         <runningAs username="SYSTEM" />
11     </preConditions>
12 13     <changeSet id="1" author="bob">
14         <preConditions onFail="WARN">
15             <sqlCheck expectedResult="0">select count(*) from oldtable</sqlCheck>
16         </preConditions>
17         <comment>Comments should go after preCondition. If they are before then liquibase usually gives error.</comment>
18         <dropTable tableName="oldtable"/>
19     </changeSet>
20 </databaseChangeLog>

 

上述的示例,是只有在Oracle数据库以及用户是SYSTEM时才会执行。

preConditions前置条件分为正常和异常情况: 正常情况下,无论返回的值是不是预料的值(0),oldtable都会被删除,只是如果不是预料的值,这里会给出WARN; 异常情况下,也就是如果oldtable不存在,删除oldtable的命令将不会执行。

1)处理失败和错误
AttributeDescription
onFail 当preConditions是失败情形下如何处理
OnError 当preConditions是错误情形下如何处理
onSqlOutput 在updateSQL模式下要做什么
onFailMessage 输出的失败信息
onErrorMessage 输出的错误信息

OnFail/OnError值可能配置的值

ValueDescription
HALT 立即停止执行整个更改日志。 [默认]
CONTINUE 跳过* changeSet 。 下次更新时将再次尝试执行更改集。 继续 changelog *。
MARK_RAN 跳过更改集,但将其标记为已执行。继续更改日志。
WARN 输出警告并继续照常执行* changeSet * / * changelog *。

onSqlOutput可能配置的值

ValueDescription
TEST 在updateSQL模式下运行changeSet
FAIL 使preConditons在updateSQL模式下失败
IGNORE 忽略updateSQL模式中的preConditons(默认)。
2)and/or/not逻辑

可以使用nestable <and><or><not>标记将条件逻辑应用于前置条件。如果没有指定条件标记,则默认为AND。

示例:

1 <preConditions onFail="WARN">
2     <dbms type="oracle" />
3     <runningAs username="SYSTEM" />
4 </preConditions>

 

这里就是默认值AND,也就是同时满足既是oracle数据库,并且用户必须是SYSTEM才会执行。

如果使数据更改可以在oracle和mysql中可以执行,需要用到or表达式:

1  <preConditions>
2      <or>
3          <dbms type="oracle" />
4          <dbms type="mysql" />
5      </or>
6  </preConditions>

 

复合条件,例如,是oracle数据库,并且用户必须是SYSTEM 或者 数据库是mysql,且用户需要为root时,可以这样写:

 1  <preConditions>
 2      <or>
 3          <and>
 4             <dbms type="oracle" />
 5             <runningAs username="SYSTEM" />
 6          </and>
 7          <and>
 8             <dbms type="mysql" />
 9             <runningAs username="root" />
10          </and>
11      </or>
12  </preConditions>

 

3)可用的preConditions
  • <dbms>:如果针对指定类型执行的数据库匹配,则可以传递。

<dbms type="mysql" />
  • <runningAs>:执行执行的用户,匹配才可以传递。

<runningAs username="root" />
  • <changeSetExecuted>:如果指定的changeSet被执行了才可以传递。

<changeSetExecuted id="1" author="YoungLu" changeLogFile="classpath:liquibase/changelog/2020-02-11-change.xml" />
  • <columnExists>:如果数据库中的指定列存在则传递

<columnExists schemaName="young_webchat" tableName="y_user" columnName="username" />
  • <tableExists>:如果数据库中的表存在,则传递

<tableExists schemaName="young_webchat" tableName="y_user" />
  • <viewExists>:如果数据库中的视图存在,则传递

<viewExists schemaName="young_webchat" viewName="y_user_view" />
  • <foreignKeyConstraintExists>:如果外键存在则传递

<foreignKeyConstraintExists schemaName="young_webchat" foreignKeyName="y_user_log_fk" />
  • <indexExists>:如果索引存在则传递

<indexExists schemaName="young_webchat" indexName="y_user_idx" />
  • <sequenceExists>:如果序列存在则传递

<sequenceExists schemaName="young_webchat" sequenceName="y_user_seq" />
  • <primaryKeyExists>:如果主键存在则传递

<primaryKeyExists schemaName="young_webchat" primaryKeyName="y_user_id" />
  • <sqlCheck>:执行SQL检查。SQL必须返回具有单个值的单个行。

<sqlCheck expectedResult="1">SELECT COUNT(1) FROM pg_tables WHERE TABLENAME = 'myRequiredTable'</sqlCheck>
  • <changeLogPropertyDefined>:检查给定的changelog参数是否存在。如果一个值也是给定的,如果这个值与给定的值不相同那么它只会失败。

<changeLogPropertyDefined property="myproperty"/>
<changeLogPropertyDefined property="myproperty" value="requiredvalue"/>
  • <customPrecondition>:可以通过创建实现liquibase.precondition的类来创建自定义前置条件。CustomPrecondition接口。自定义类的参数是通过基于子标记的反射设置的。参数作为字符串传递给自定义前置条件。

1 <customPrecondition className="com.example.CustomTableCheck">
2     <param name="tableName" value="our_table"/>
3     <param name="count" value="42"/>
4 </customPrecondition>

2.2.2.Properties标签

为changelog定义一个参数。给定上下文 和/或 数据库的列表,该参数将仅在这些上下文 和/或 数据库中使用。

示例:

 1 <databaseChangeLog
 2         xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
 3         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4         xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
 5         xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd
 6         http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
 7  8     <property name="clob.type" value="clob" dbms="oracle"/>
 9     <property name="clob.type" value="longtext" dbms="mysql"/>
10 11     <changeSet id="1" author="joe">
12          <createTable tableName="${table.name}">
13              <column name="id" type="int"/>
14              <column name="${column1.name}" type="${clob.type}"/>
15              <column name="${column2.name}" type="int"/>
16          </createTable>
17     </changeSet>
18 </databaseChangeLog>

 

可用的配置项

AttributeDescription
name 表的数据库名称
value 所需列的表的名称
context 上下文,逗号分隔
dbms 要用于该changeSet 的数据库的类型。关键字all和none也可用。
global 定义属性是全局的还是局限于databaseChangeLog。“true”或“false”。

示例:

1 <property name="simpleproperty" value="somevalue"/>
2 <property name="clob.type" value="clob" dbms="oracle,h2"/>
3 <property name="clob.type" value="longtext" dbms="mysql"/>
4 <property name="myproperty" value="yes" context="common,test"/>
5 <property name="localproperty" value="foo" global="false"/>

 

1)类型、函数的兼容性(不建议这么用,直接用liquibase自带类型即可)
 1     <property name="autoIncrement" value="true" dbms="mysql" global="true"/>
 2  3     <!--clob类型-->
 4     <property name="clob.type" value="longtext" dbms="mysql"/>
 5     <property name="clob.type" value="clob" dbms="oracle, mssql, mariadb, postgresql"/>
 6  7     <!--int,还是不建议用,因为oracle和sql server 很难表示对应的4 294 967 295-->
 8     <property name="int_unsigned" value="int unsigned" dbms="mysql" global="true"/>
 9     <property name="int_unsigned" value="int" dbms="oracle, mssql" global="true"/>
10 11     <!--tinyint可以直接用,但是mysql的数值范围是-128到127, oracle和sql server则是 0到255 -->
12     <!--tinyint_unsigned-->
13     <property name="tinyint_unsigned" value="tinyint unsigned" dbms="mysql" global="true"/>
14     <property name="tinyint_unsigned" value="tinyint" dbms="mssql" global="true"/>
15     <property name="tinyint_unsigned" value="Number(3, 0)" dbms="oracle" global="true"/>
16     
17     <!--boolean,没必要写boolean的兼容配置,想用的话直接用boolean就可以,liquibase会自动处理好-->
18     <property name="boolean" value="tinyint" dbms="mysql" global="true"/>
19     <property name="boolean" value="number(1, 0)" dbms="oracle" global="true"/>
20     <property name="boolean" value="bit" dbms="mssql" global="true"/>
21     
22     <!-- Long整型存储 -->
23     <property name="bigint" value="bigint" dbms="mysql" global="true"/>
24     <property name="bigint" value="number(20,0)" dbms="oracle,mssql" global="true"/>
25 26     <!-- Nvarchar兼容配置 -->
27     <property name="nvarchar" value="varchar" dbms="mysql" global="true"/>
28     <property name="nvarchar" value="nvarchar" dbms="oracle,mssql" global="true"/>
29 30     <!--float-->
31     <property name="floatType" value="float4" dbms="postgresql, h2"/>
32     <property name="floatType" value="float" dbms="mysql, oracle, mssql, mariadb"/>
33 34     <!-- 当前日期 -->
35     <property name="now" value="now()" dbms="h2"/>
36     <property name="now" value="now()" dbms="mysql"/>
37     <property name="now" value="getutcdate()" dbms="mssql"/>
38     <property name="now" value="sysdate" dbms="oracle"/>
39 40     <property name="uuidType" value="varchar(36)" dbms="h2, mysql, mariadb"/>
41     <property name="sequenceSchemaName" value="YHY" dbms="oracle, mssql"/>
42

 

2.2.3. changeSet标签

将一个个数据库更改分开

示例:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2  3 <databaseChangeLog
 4   xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
 5   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 6   xmlns:pro="http://www.liquibase.org/xml/ns/pro"
 7   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd
 8       http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-3.8.xsd">
 9     <changeSet id="1" author="bob">
10         <comment>A sample change log</comment>
11         <createTable/>
12     </changeSet>
13     <changeSet id="2" author="bob" runAlways="true">
14         <alterTable/>
15     </changeSet>
16     <changeSet id="3" author="alice" failOnError="false" dbms="oracle">
17         <alterTable/>
18     </changeSet>
19     <changeSet id="4" author="alice" failOnError="false" dbms="!oracle">
20         <alterTable/>
21     </changeSet>
22 23 </databaseChangeLog>

 

一般主要由“id” 、“author”、changelog文件路径名组成

3.1.可用的属性值
属性描述
id 唯一识别,不一定是数字
author 作者
dbms 数据库类型
runAlways 在每次运行时执行changeset ,即使之前已经运行过
runOnChange 在第一次看到更改时执行更改,并且在每次changeset 时执行更改
context 控制是否执行changeset,这取决于运行时设置。任何字符串都可以用于上下文名称,它们被不区分大小写地选中。
labels 控制是否执行changeset,这取决于运行时设置。任何字符串都可以用于标签名称,并且不区分大小写地选中它们。
runInTransaction 是否应该将changeset作为单个事务运行(如果可能的话)?默认值为true。
failOnError 如果在执行changeset时发生错误,迁移是否应该失败
objectQuotingStrategy 这控制了在生成的SQL中如何引用对象名,或者在对数据库的调用中如何使用对象名。不同的数据库对对象的名称执行不同的操作,例如Oracle将所有内容都转换为大写(除非使用引号)。有三个可能的值。默认值是LEGACY。三个配置的值: LEGACY - Same behavior as in Liquibase 2.0 QUOTE_ALL_OBJECTS - 每个对象都加上双引号 :person becomes “person”.QUOTE_ONLY_RESERVED_WORDS - 在保留关键字和可用列名上面加双引号

 

3.2.可用的子标签
1)comment

注释

 

2)preConditions

前置条件,例如做一些不可逆操作前的必要检查

 

3)Any Refactoring Tag(s)

<Any Refactoring Tag(s)>要作为这个更改集的一部分运行的数据库更改

 

4)validCheckSum

添加一个校验和,不管数据库中存储了什么,它都被认为对这个changeset是有效的。主要用于需要更改changeset,并且不希望在已经运行了changeset的数据库上抛出错误(不推荐使用此过程)

 

5)rollback

描述如何回滚更改集的SQL语句或重构标记

rollback标签的示例:

 1 <changeSet id="1" author="bob">
 2     <createTable tableName="testTable">
 3     <rollback>
 4         drop table testTable
 5     </rollback>
 6 </changeSet>
 7 <changeSet id="1" author="bob">
 8     <createTable tableName="testTable">
 9     <rollback>
10         <dropTable tableName="testTable"/>
11     </rollback>
12 </changeSet>
13 <changeSet id="2" author="bob">
14     <dropTable tableName="testTable"/>
15     <rollback changeSetId="1" changeSetAuthor="bob"/>
16 </changeSet>

 这里发生了回滚,会调用id为1的changeSet 。

6)createIndex

【强制】主键索引名为pk字段名;唯一索引名为uk字段名;普通索引名则为idx字段名。 说明:pk 即primary key;uk_ 即 unique key;idx_ 即index的简称。

  • 普通索引名称以IDX为前缀。

  • 单字段索引的命名方式为:IDX表名字段名,表名无须前缀,命名长度太长时表名和字段名可以考虑缩写。

  • 多字段联合索引命名方式同单字段,考虑长度限制,可以只列出主要字段名或者采用缩写方式描述索引字段。 示例: \1. 错误命名:IDX_USER_INFO,没有给出字段名 \2. 错误命名:IDX_USER_INFO_DEPT_CODE,前缀错误。

1 <changeSet id="20200509001" author="dongfang">
2   <createIndex tableName="worker" indexName="idx_name">
3     <column name="name"></column>
4   </createIndex>
5   <createIndex tableName="worker" indexName="idx_address_tel">
6     <column name="address"></column>
7     <column name="tel"></column>
8   </createIndex>
9 </changeSet>

 

7)column

可以是单标签,也可以是双标签。双标签可以嵌套 <constraints /> 标签

 

8)addPrimaryKey
  <addPrimaryKey columnNames="event_id, name" tableName="c_sys_persist_audit_evt_data"/> 
9)addNotNullConstraint
1          <addNotNullConstraint   columnName="password_hash"
2                                  columnDataType="varchar(60)"
3                                  tableName="c_usr_user"/>
10)addForeignKeyConstraint
1         <addForeignKeyConstraint baseColumnNames="event_id"
2                                  baseTableName="c_sys_persist_audit_evt_data"
3                                  constraintName="fk_evt_pers_audit_evt_data"
4                                  referencedColumnNames="event_id"
5                                  referencedTableName="c_sys_persistent_audit_event"/>

 

11)dropDefaultValue
<dropDefaultValue tableName="c_sys_common_menu" columnName="created_date" columnDataType="datetime"/>

 

12)loadData
1 <loadData
2           file="config/liquibase/project/user/fake-data/common_menu.csv"
3           separator=";"
4           tableName="c_sys_common_menu">
5     <column name="id" type="numeric"/>
6     <column name="created_by" type="string"/>
7     <column name="created_date" type="datetime"/>
8     <!-- jhipster-needle-liquibase-add-loadcolumn - JHipster (and/or extensions) can add load columns here, do not remove-->
9 </loadData>

2.2.4.include标签

将change-logs拆分为易于管理的部分。

例如:

<?xml version="1.0" encoding="UTF-8"?><databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
    <include file="com/example/news/news.changelog.xml"/>
    <include file="com/example/directory/directory.changelog.xml"/>
</databaseChangeLog>

 

可用的配置项

AttributeDescription
file 被引入的文件
relativeToChangelogFile 用文件的相对路径而不是classpath
context 向所有包含的changeSets追加上下文(使用AND)

 

 

三、liquibase数据类型完整列表(重要),这里的换行没有全部整理好

1、boolean

MySQL:BIT(1),经测试确实是bit(1)

MSSQL:[bit]

OracleNUMBER(1)

SQLite:BOOLEAN

H2:BOOLEAN

PostgresDatabase:BOOLEAN

Unsupported:BOOLEAN

DB2:SMALLINT

Hsql:BOOLEAN

FirebirdDatabase:SMALLINT

DerbyDatabase:SMALLINT

InformixDatabase :BOOLEAN

SybaseDatabase:BIT

SybaseASADatabase:BIT

2、tinyint

MySQL:TINYINT

MSSQL:[tinyint]

Oracle:NUMBER(3)

SQLiteDatabase:TINYINT

H2Database:TINYINT

PostgresDatabase:SMALLINT

UnsupportedDatabase:TINYINT

DB2Database:SMALLINT

HsqlDatabase:TINYINT

FirebirdDataba se:SMALLINT

DerbyDatabase:SMALLINT

InformixDatabase:TINYINT

SybaseDatabase:TINYINT

SybaseASADatabase:TINYINT

3、int

MySQL:INT

MSSQL:[int]

Oracle:INTEGER

SQLiteDatabase:INTEGER

H2Database:INT

PostgresDatabase:INT

UnsupportedDatabase:INT

DB2Database:INTEGER

HsqlDatabase:INT

FirebirdDatabase:INT

DerbyDatabase:INTEGER

InformixDatabase:INT

SybaseDatabase:INT

SybaseASADatabase:INT

4、mediumint

MySQLDatabase:MEDIUMINT

SQLiteDatabase:MEDIUMINT

H2Database:MEDIUMINT

PostgresDatabase:MEDIUMINT

UnsupportedDatabase:MEDIUMINT

DB2Database:MEDIUMINT

MSSQLDatabase:[int]

OracleDatabase:MEDIUMINT

HsqlDatabase:MEDIUMINT

FirebirdDatabase:MEDIUMINT

DerbyDatabase:MEDIUMINT

InformixDatabase:MEDIUMINT

SybaseDatabase:MEDIUMINT

SybaseASADatabase:MEDIUMINT

5、bigint

MySQL:BIGINT

MsSQL:[bigint]

Oracle:NUMBER(38,0)

SQLiteDatabase:BIGINT

H2Database:BIGINT

PostgresDatabase:BIGINT

UnsupportedDatabase:BIGINT

DB2Database:BIGINT

HsqlDatabase:BIGINT

FirebirdDatabase:BIGINT

DerbyDatabase:BIGINT

InformixDatabase:INT8

SybaseDatabase:BIGINT

SybaseASADatabase: BIGINT

6、float

MySQLDatabase:FLOAT

SQLiteDatabase:FLOAT

H2Database:FLOAT

PostgresDatabase:FLOAT

UnsupportedDatabase:FLOAT

DB2Database :FLOAT

MSSQLDatabase:[float](53)

OracleDatabase:FLOAT HsqlDatabase:FLOAT

FirebirdDatabase:FLOAT

DerbyDatabase:FLOAT

InformixDatabase:FLOAT

SybaseDatabase:FLOAT

SybaseASADatabase:FLOAT

7、 double

MySQL:DOUBLE

MSSQL:[float](53)

Oracle:FLOAT(24)

 

SQLiteDatabase:DOUBLE

H2Database:DOUBLE

PostgresDatabase:DOUBLE

PRECISION UnsupportedDatabase:DOUBLE

DB2Database:DOUBLE

HsqlDatabase:DOUBLE

FirebirdDatabase:DOUBLE PRECISION

DerbyDatabase:DOUBLE

InformixDatabase:DOUBLE PRECISION

SybaseDatabase:DOUBLE

SybaseASADatabase:DOUBLE

8、decimal

MySQL:DECIMAL

MSSQL:[decimal](18,0)

Oracle:DECIMAL

SQLiteDatabase:DECIMAL

H2Database:DECIMAL

PostgresDatabase:DECIMAL

UnsupportedDatabase:DECIMAL

DB2Database:DECIMAL

HsqlDatabase:DECIMAL

FirebirdDatabase:DECIMAL

DerbyDatabase:DECIMAL

InformixDatabase:DECIMAL

SybaseDatabase:DECIMAL

SybaseASADatabase:DECIMAL

9、number

MySQL:numeric,经测试会是decimal(10, 0)

MSSQL:[numeric](18,0)

Oracle:NUMBER

SQLiteDatabase:NUMBER

H2数据库:NUMBER

PostgresDatabase:numeric

UnsupportedDatabase:NUMBER

DB2Database:numeric

HsqlDatabase:numeric

FirebirdDatabase:numeric

DerbyDatabase:numeric

InformixDatabase:numeric

SybaseDatabase:numeric

SybaseASADatabase:numeric

10、blob

MySQL:LONGBLOB,经测试是blob

MSSQL:[varbinary](MAX)

Oracle:BLOB

SQLiteDatabase:BLOB H2Database:BLOB PostgresDatabase:BYTEA

UnsupportedDatabase:BLOB DB2Database:BLOB

HsqlDatabase: BLOB FirebirdDatabase:BLOB DerbyDatabase:BLOB

InformixDatabase:BLOB SybaseDatabase:IMAGE SybaseASADatabase:LONG BINARY

11、clob

MySQL:LONGTEXT

MSSQL:[varchar](MAX)

Oracle:CLOB

SQLiteDatabase:TEXT

H2 :CLOB

PostgresDatabase:TEXT

UnsupportedDatabase:CLOB

DB2Database:CLOB

HsqlDatabase:CLOB

FirebirdDatabase:BLOB

SUB_TYPE TEXT

DerbyDatabase:CLOB

InformixDatabase :CLOB

SybaseDatabase:TEXT

SybaseASADatabase:LONG VARCHAR

12、 function

MySQL:FUNCTION

SQLiteDatabase:FUNCTION

H2Database:FUNCTION

PostgresDatabase:FUNCTION

UnsupportedDatabase:FUNCTION

DB2Database:FUNCTION

MSSQLDatabase:[function]

OracleDatabase:FUNCTION

HsqlDatabase:FUNCTION

FirebirdDatabase:FUNCTION

DerbyDatabase:FUNCTION

InformixDatabase:FUNCTION

SybaseDatabase:FUNCTION

SybaseASADatabase:FUNCTION

13、 UNKNOWN

MySQLDatabase: UNKNOWN

SQLiteDatabase:UNKNOWN

H2Database:UNKNOWN

PostgresDatabase:UNKNOWN

UnsupportedDatabase:UNKNOWN

DB2Database:UNKNOWN

MSSQLDatabase:[UNKNOWN]

OracleDatabase :UNKNOWN

HsqlDatabase:UNKNOWN

FirebirdDatabase:UNKNOWN

DerbyDatabase:UNKNOWN

InformixDatabase:UNKNOWN

SybaseDatabase:UNKNOWN

SybaseASADatabase:UNKNOWN

14、datetime

MySQL:datetime

MSSQL:[datetime]

Oracle:TIMESTAMP

 

SQLiteDatabase:TEXT

H2Database:TIMESTAMP

PostgresDatabase:TIMESTAMP WITHOUT TIME ZONE

UnsupportedDatabase:datetime

DB2Database:TIMESTAMP

HsqlDatabase:TIMESTAMP

FirebirdDatabase:TIMESTAMP

DerbyDatabase:TIMESTAMP

InformixDatabase:DATETIME年份分数(5)

SybaseDatabase:datetime

SybaseASADatabase:datetime

15、time

MySQL:time

MSSQL:[time](7) 

 

Oracle:DATE 

 

SQLiteDatabase:time

H2Database:time

PostgresDatabase:TIME WITHOUT TIME ZONE

UnsupportedDatabase:time

DB2Database:time

HsqlDatabase:time

FirebirdDatabase:time DerbyDatabase:time

InformixDatabase:INTERVAL HOUR TO FRACTION(5)

SybaseDatabase:time

SybaseASADatabase:time

16、timestamp

MySQL:timestamp

MSSQL:[datetime]

Oracle:TIMESTAMP

 

SQLiteDatabase:TEXT

H2Database:TIMESTAMP

PostgresDatabase:TIMESTAMP WITHOUT TIME ZONE

UnsupportedDatabase:timestamp

DB2Database:timestamp

HsqlDatabase:TIMESTAMP

FirebirdDatabase:TIMESTAMP

DerbyDatabase:TIMESTAMP

InformixDatabase:DATETIME年份分数(5)

SybaseDatabase:datetime

SybaseASADatabase: timestamp

17、date

MySQL:date

MSSQL:[date]

Oracle:date

 

SQLiteDatabase:date

H2Database:date

PostgresDatabase:date

UnsupportedDatabase:date

DB2Database :date

HsqlDatabase:date

FirebirdDatabase:date

DerbyDatabase:date

InformixDatabase:date

SybaseDatabase:date

SybaseASADatabase:date

18、char

MySQL:CHAR

MSSQL:[char](1)

Oracle:CHAR

 

SQLiteDatabase:CHAR

H2Database:CHAR

PostgresDatabase:CHAR

UnsupportedDatabase:CHAR

DB2Database:CHAR

HsqlDatabase:CHAR

FirebirdDatabase:CHAR

DerbyDatabase:CHAR

InformixDatabase:CHAR

SybaseDatabase:CHAR

SybaseASADatabase:CHAR

19、varchar

MySQL:VARCHAR

MSSQL:[varchar](1)

Oracle:VARCHAR2

 

SQLiteDatabase:VARCHAR

H2Database:VARCHAR

PostgresDatabase:VARCHAR

UnsupportedDatabase: VARCHAR

DB2Database:VARCHAR

HsqlDatabase:VARCHAR

FirebirdDatabase:VARCHAR

DerbyDatabase:VARCHAR

InformixDatabase:VARCHAR

SybaseDatabase:VARCHAR

SybaseASADatabase:VARCHAR

20、nchar

MySQL:NCHAR

MSSQL:[nchar](1)

Oracle:NCHAR

SQLiteDatabase:NCHAR

H2Database:NCHAR

PostgresDatabase:NCHAR

UnsupportedDatabase:NCHAR

DB2Database:NCHAR

HsqlDatabase:CHAR

FirebirdDatabase:NCHAR

DerbyDatabase:NCHAR

InformixDatabase:NCHAR

SybaseDatabase:NCHAR

SybaseASADatabase:NCHAR

21、nvarchar

MySQL:NVARCHAR,经测试,mysql还是用的varchar,但是mysql的varchar就相当于nvarchar。

MSSQL:[nvarchar](1)

Oracle:NVARCHAR2

SQLiteDatabase:NVARCHAR

H2Database:NVARCHAR

PostgresDatabase:VARCHAR

UnsupportedDatabase:NVARCHAR

DB2Database:NVARCHAR

HsqlDatabase:VARCHAR

FirebirdDatabase:NVARCHAR

DerbyDatabase: VARCHAR

InformixDatabase:NVARCHAR

SybaseDatabase:NVARCHAR

SybaseASADatabase:NVARCHAR

22、currency

MySQLDatabase:DECIMAL

SQLiteDatabase:REAL

H2Database:DECIMAL

PostgresDatabase:DECIMAL

UnsupportedDatabase:DECIMAL

DB2Database:DECIMAL(19,4)

MSSQLDatabase:[money]

OracleDatabase:NUMBER(15,2)

HsqlDatabase: DECIMAL

FirebirdDatabase:DECIMAL(18,4)

DerbyDatabase:DECIMAL

InformixDatabase:MONEY

SybaseDatabase:MONEY

SybaseASADatabase:MONEY

23、uuid

MySQL:char(36)  

MSSQL:[uniqueidentifier]

Oracle:RAW(16)

SQLite:TEXT  

H2Database:UUID

PostgresDatabase:UUID

UnsupportedDatabase:char(36)

DB2Database:char(36 )  

HsqlDatabase:char(36)

FirebirdDatabas e:char(36)

DerbyDatabase:char(36)

InformixDatabase:char(36)

SybaseDatabase:UNIQUEIDENTIFIER

SybaseASADatabase:UNIQUEIDENTIFIER

 

 参考博客https://blog.csdn.net/a112626290/article/details/104263790

 也借鉴了外文博客,算是整理的文章,不再各个标明出处,一并感谢。

 

posted on 2020-08-06 11:24  东方1024  阅读(5480)  评论(2)    收藏  举报

导航