Liquibase目前如何处理字符编码?

时间:2015-02-12 15:09:03

标签: sql encoding liquibase changeset

你能解释一下Liquibase(例如版本3.3.2)目前是如何处理字符编码的吗?

1 / XML格式的变更集以UTF-8声明。但是,某些更改可以直接在XML中内联声明(例如'sql'),而其他更改可以直接从外部文件导入(例如'sqlFile')。

对于第一个(内联),您是否可以确认这些更改显然必须与XML更改集相同的字符编码(因此只有UTF-8)? 是否可以更改不同的字符编码而不是UTF-8? 如果是这样,那么是否必须在XML声明中设置特定的编码(例如encoding =“ISO-8859-1”)而不是UTF-8? 最后,我们如何通知Liquibase应该使用特定的编码解析这些变更集(例如Java系统属性)?

对于第二个(作为文件导入),您能确认这些更改可以设置为另一个字符编码而不是UTF-8吗? 如果是这样,您能否确认我们必须将这些更改的“编码”属性设置为适当的字符编码? 那么我们是否可以将XML变更集声明为UTF-8,但更改设置为不同的字符编码(例如encoding =“ISO-8859-1”)? 最后,我们是否需要以任何方式通知Liquibase以特定的编码解析变更集(例如Java系统属性)?

2 / SQL格式的变更集也是一个不同的故事。无法在这些文件中设置任何元数据以通知Liquibase解析这些文件时要使用的字符编码。

Liquibase用什么字符编码来解析这些文件? UTF-8还是其他任何字符编码? 是否可以更改不同的字符编码而不是UTF-8? 如果是这样,如何声明它,我们如何通知Liquibase有关用于解析这些文件的字符编码(例如Java系统属性)?

据我所知,可以使用Liquibase设置几个Java系统属性:

  • file.encoding,
  • liquibase.file.encoding,
  • liquibase.ouputFileEncoding。

然而,这些Java系统属性似乎更多地影响更改的编写过程而不是解析过程。

目前,我们的大多数数据库都使用ISO-8859-1或Windows-1252,但Liquibase似乎只能正确处理UTF-8变更集。您对这些问题的回答将有助于我们理解

  • 提供与字符编码相关的功能 Liquibase,和
  • 根据使用情况存在哪些限制 变更格式。

我事先感谢你的帮助,

贝特朗

2 个答案:

答案 0 :(得分:0)

我认为文件是使用FileSystemResourceAccessor在liquibase中读取的,并且没有可以专门设置的编码。 这意味着它将使用底层Java将使用的东西。而InputStreamReader将使用默认的系统编码。

因此,您应该能够通过以下方式设置JVM的编码来影响这一点:

-Dfile.encoding=UTF-8 

使用SAX解析器解析XML文件(也许SAX解析器会做更多的事情来识别编码。)

对于sql文件格式的变更集,它将使用UtfBomAwareReader阅读器。 虽然有代码试图在UtfBomAwareReader中识别编码,但我认为SqlChangeLogParser没有使用它(截至目前),而是默认为" UTF-8"。

据我所知。因此,在您基于此做出重大设计决策之前,请尝试自行验证。

答案 1 :(得分:0)

在执行liquibase之前设置它,例如在Windows环境中:

set JAVA_OPTS="-Dfile.encoding=UTF-8"
liquibase.bat