LiquiBase вставляет акцентированные символы в Oracle - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь выполнить следующую вставку с помощью LiquiBase:

INSERT INTO table (id, value) VALUES (0, 'nullás')
//

Это, очевидно, случайное значение, цель состоит в том, чтобы вставить в столбец VARCHAR2 символы, отличные от Engli sh. Цель - Oracle 12 c. Если я запускаю вставку вручную через SQL Developer из моего P C, она работает нормально. Но когда я запускаю его через LiquiBase из того же P C, он выдает следующее:

null�s

Журнал выполнения:

INSERT INTO table (id, value) VALUES (0, 'null?s')

Сама вставка содержится в отдельном SQL файл. Он добавляется в файл набора изменений следующим образом:

<?xml version = "1.0" encoding = "UTF-8" standalone = "no" ?>
<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.1.xsd">

    <changeSet id="1" author="aaa" >
        <comment>insert.sql</comment>
        <sqlFile dbms="oracle" encoding="UTF-8" path="insert.sql" relativeToChangelogFile="true" endDelimiter="//" />
    </changeSet>

Ранее кодировка была установлена ​​на «utf8», что, я думаю, было опечаткой, но проблема возникает после изменения его на «UTF-8» , Соответствующие настройки POM:

<?xml version = "1.0" encoding = "UTF-8" standalone = "no" ?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>aaa</groupId>
    <artifactId>aaa</artifactId>
    <version>1.0.0</version>
    <packaging>jar</packaging>

    <properties>
        <version.ojdbc>12.2.0.1.0</version.ojdbc>
        <version.org.liquibase.liquibase-maven-plugin>3.6.2</version.org.liquibase.liquibase-maven-plugin>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <liquibase.url>jdbc:oracle:thin:@1.2.3.4:1521/aaa</liquibase.url>
        <!-- liquibase.url>offline:oracle?outputLiquibaseSql=true</liquibase.url -->
        <liquibase.execute.goal>update</liquibase.execute.goal>
        <liquibase.driver>oracle.jdbc.OracleDriver</liquibase.driver>
    </properties>

    <build>
        <plugins> 
            <plugin>
                <groupId>org.liquibase</groupId>
                <artifactId>liquibase-maven-plugin</artifactId>
                <version>${version.org.liquibase.liquibase-maven-plugin}</version>
                <configuration>
                    <propertyFile>liquibase.properties</propertyFile>
                    <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
                    <outputFileEncoding>UTF-8</outputFileEncoding>
                    <systemProperties>
                        <property>
                            <name>file.encoding</name>
                            <value>UTF-8</value>
                        </property>
                    </systemProperties>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>com.oracle</groupId>
                        <artifactId>ojdbc8</artifactId>
                        <version>${version.ojdbc}</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>liquibase_01</id>
            <properties>
                <liquibase.changeLogFile>liquibase_01.xml</liquibase.changeLogFile>
                <liquibase.username>${admin.shema.name}</liquibase.username>
                <liquibase.password>${admin.shema.password}</liquibase.password>
                <liquibase.migrationSqlOutputFile>target/liquibase/migr_01.sql</liquibase.migrationSqlOutputFile>
            </properties>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.liquibase</groupId>
                        <artifactId>liquibase-maven-plugin</artifactId>
                        <executions>
                            <execution>
                                <phase>process-resources</phase>
                                <goals>
                                    <goal>${liquibase.execute.goal}</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

Я уже попробовал следующее:

  • Добавлена ​​строка <?xml... для всех файлов xml, она не добавлена ​​
  • В основном все вышеописанные конфигурации UTF-8 были добавлены мной недавно
  • Добавлен "-Dfile.encoding = UTF-8" в командную строку maven
  • Установите переменную MAVEN_OPTS to "-Dfile.encoding = UTF-8"

Я не уверен, что еще я могу попробовать. Это может быть настройка на стороне Oracle? Набор символов выглядит как «AL32UTF8»:

select value from nls_database_parameters where parameter='NLS_CHARACTERSET';

AL32UTF8

NLS_LANG Переменная не установлена ​​на серверной ОС Oracle.

Oracle сама установлена ​​на Windows Server 2008 R2 с локализацией Engli sh. С другой стороны, та же версия LiquiBase с той же средой выполнения отлично работает с SQL Server 2017 (установлен на Windows Server 2016 с локализацией Engli sh), акцентированные символы вставляются с тем же оператором INSERT, что и выше. И ни одна из перечисленных выше подробных настроек UTF-8 не включена в этой части проекта.

1 Ответ

1 голос
/ 26 марта 2020

Решением был комментарий SteveDon ie выше: кодировка файла должна быть UTF-8.

...