【问题标题】:How Liquibase is currently handling character encoding?Liquibase 当前如何处理字符编码?
【发布时间】:2015-04-13 09:26:52
【问题描述】:

您能否解释一下 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,以及
  • 存在哪些限制取决于所使用的 变更集格式。

提前感谢您的帮助,

伯特兰

【问题讨论】:

    标签: sql encoding liquibase changeset


    【解决方案1】:

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

    所以你应该能够通过设置 JVM 的编码来影响这一点:

    -Dfile.encoding=UTF-8 
    

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

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

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

    【讨论】:

    • 感谢您为我指明了正确的方向……我查看了 Liquibase 代码,发现了几个问题。所有解析器都使用UtfBomAwareReader。但是它们中的任何一个都设置了在创建此类的实例时要使用的字符集名称。因此,使用 UTF-8 作为默认字符集名称来读取所有更改日志文件(无论使用何种更改日志文件格式)。因此,格式化的 sql 更改日志文件始终被解析为 UTF-8,即使这些更改针对的是另一个字符集。
    • UtfBomAwareReader 实例直接创建或通过StreamUtil 类的getStreamContents() 方法创建。在这两种情况下都可以指定字符集名称,但在每个更改日志解析器中,不提供字符集名称或将字符集名称设置为空。所以默认使用UTF-8。
    • SqlChangeLogParser 使用 StreamUtil 但将字符集名称设置为 null。所以总是使用 UTF-8。
    • FormattedSqlChangelogParser 直接创建UtfBomAwareReader 的实例,但不设置默认字符集名称。所以总是使用 UTF-8。
    • 我不知道您是否应该使用此处的评论部分来写下您对 liquibase 如何工作/不工作的所有发现。如果您发现重要细节,请考虑编辑我的答案。并考虑为此在 liquibase jira 中打开增强请求。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 2022-10-30
      • 2014-12-22
      • 1970-01-01
      相关资源
      最近更新 更多