H2和Oracle兼容性问题
我在使用Flyway和H2数据库执行以下脚本时遇到问题。我假设这是一个Oracle兼容性问题,但我使用的H2模式是正确的。此脚本用于在生产环境中构造表,但我想使用内存中的数据库进行测试。设置和错误如下。如果可能的话,我不想重写内存中数据库的脚本 Jdbc.propertiesH2和Oracle兼容性问题,oracle,maven-3,h2,flyway,Oracle,Maven 3,H2,Flyway,我在使用Flyway和H2数据库执行以下脚本时遇到问题。我假设这是一个Oracle兼容性问题,但我使用的H2模式是正确的。此脚本用于在生产环境中构造表,但我想使用内存中的数据库进行测试。设置和错误如下。如果可能的话,我不想重写内存中数据库的脚本 Jdbc.properties jdbc.driver=org.h2.Driver jdbc.url=jdbc:h2:file:target/firmsoftDB;MODE=Oracle jdbc.username=sa jdbc.password=
jdbc.driver=org.h2.Driver
jdbc.url=jdbc:h2:file:target/firmsoftDB;MODE=Oracle
jdbc.username=sa
jdbc.password=
Sql脚本
CREATE TABLE USER_INFO
(
USER_INFO_ID NUMBER NOT NULL,
USER_NAME VARCHAR2(32 BYTE) NOT NULL,
EMAIL VARCHAR2(320 BYTE) NULL,
LAST_NAME VARCHAR2(32 BYTE) NOT NULL,
FIRST_NAME VARCHAR2(32 BYTE) NOT NULL,
LAST_LOGIN TIMESTAMP(6) NULL,
USER_TYPE VARCHAR2(32 BYTE) NULL,
USER_CN VARCHAR2(32 BYTE) NULL,
SOURCE_DIRECTORY VARCHAR2(15 BYTE) NULL,
PRIMARY_PHONE VARCHAR2(32 BYTE) NULL,
ALT_PHONE VARCHAR2(32 BYTE) NULL,
CREATED_BY NUMBER NOT NULL,
CREATED_DATE TIMESTAMP(6) NOT NULL,
UPDATED_BY NUMBER NOT NULL,
UPDATED_DATE TIMESTAMP(6) NOT NULL
)
LOGGING
NOCOMPRESS
NOCACHE
NOPARALLEL
MONITORING;
pom.xml
<profiles>
<profile>
<id>h2-test</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<systemPropertyVariables>
<flyway.locations>db/migration</flyway.locations>
</systemPropertyVariables>
<threadCount>1</threadCount>
</configuration>
<goals>
<goal>test</goal>
</goals>
<executions>
</executions>
</plugin>
<plugin>
<groupId>com.googlecode.flyway</groupId>
<artifactId>flyway-maven-plugin</artifactId>
<version>2.2.1</version>
<configuration>
<!-- <url>jdbc:hsqldb:file:target/firmsoftDB;sql.syntax_ora=true</url> -->
<!-- <url>jdbc:hsqldb:mem:firmsoftDB;sql.syntax_ora=true</url> -->
<url>jdbc:h2:file:target/firmsoftDB;MODE=Oracle</url>
<!-- <url>jdbc:derby:\temp\db\FAQ\db</url> -->
</configuration>
</plugin>
</plugins>
</build>
</profile>
简短回答
Oracle是一个庞大的软件,你不能期望一个小型嵌入式数据库100%兼容
长话短说
兼容模式
如文件所述。然而,只有一小部分数据库之间的差异是以这种方式实现的。此列表已记录在案
兼容性
如文档所示,如HSQLDB、MySQL和PostgreSQL。存在H2不兼容的某些区域
所有数据库引擎的行为都略有不同。在可能的情况下,H2支持ANSI SQL标准,并尝试与其他数据库兼容。但是仍然存在差异。H2无法识别语法
VARCHAR2(32 BYTE)
将此更改为
VARCHAR2(32)
。。。它仍然可以在oracle中工作,并且至少可以删除H2中的第一个错误。您真的需要将varchar2作为字节吗?您可以这样指定大小:
USER\u NAME VARCHAR2(32)
试试看。对于其他列也是如此。此模式的当前形式是当前正在使用的模式,我不想更改此模式。我想让我在测试中使用的模式反映生产中的模式。你能把所有的stacktrace都放进去吗?另外,根据oracle docs.added stacktrace,监视是不推荐的。我想我刚刚在H2和HSQLDB中遇到了一个限制,如果我用VARCHAR2替换VARCHAR并删除以下关键字LOGGING NOCOMPRESS NOCACHE NOPARALLEL MONITORING Small catch,它确实有效:如果您没有明确指定字节或字符,Oracles解释将取决于NLS_LENGTH_语义的设置,默认情况下,NLS_LENGTH_语义是字节,以便向后兼容,但DBA也可以将其设置为CHAR,因为在处理字符串时,后一种设置更有意义。
VARCHAR2(32 BYTE)
VARCHAR2(32)