【问题标题】:How to test MySQL case sensitivity using H2如何使用 H2 测试 MySQL 区分大小写
【发布时间】:2016-12-14 13:12:54
【问题描述】:

我正在开发一个使用 mysql 的 Scala/Play 应用程序。我遇到了一个问题,即我的应用程序在部署到我们的集成环境时会中断,因为来自我的应用程序的 sql 查询的表和别名的大小写错误。我在开发中没有发现这一点,因为我使用的是默认情况下 MySQL 不区分大小写的 Mac。除了将我的本地环境配置为区分大小写之外,我还希望在编写大小写错误的查询时单元测试失败。如Play documentation 所述,我正在使用H2 测试数据库。我使用以下代码设置数据库,其中 schema 是具有创建脚本的字符串:

def apply[T](block: Database => T):Unit = {
  Databases.withInMemory(
     urlOptions = Map(
       "MODE" -> "MYSQL"
     ),
     config = Map(
       "logStatements" -> false
     )
   ){
  database =>
    Evolutions.withEvolutions(database, SimpleEvolutionsReader.forDefault(
      Evolution(
        1,
        schema,
        ""
      )
    )){
      block(database)
    }
  }
}

直观地说,配置映射将有一个类似"caseSensitive" -> true 或类似的选项,但我一直无法在那里找到所有选项的文档。有人知道 H2 是否有此配置选项以及它是什么?

【问题讨论】:

    标签: mysql scala playframework-2.0 h2


    【解决方案1】:

    H2 docs 和 Play 文档(基本上是引用 H2 文档)都解释了这一点:

    在 MySQL 中,文本列默认不区分大小写,而在 H2 中,它们区分大小写。但是 H2 也支持不区分大小写的列。要使用不区分大小写的文本创建表,请将 IGNORECASE=TRUE 附加到数据库 URL(例如:jdbc:h2:~/test;IGNORECASE=TRUE)。

    来自Play docs

    默认情况下,MySQL 中的文本比较不区分大小写,而在 H2 中则区分大小写(与大多数其他数据库一样)。 H2确实支持不区分大小写的文本比较,但需要单独设置,使用SET IGNORECASE TRUE。这会影响使用=LIKEREGEXP 进行比较。

    因此,您需要更改 urlOptions 以考虑 IGNORECASE 参数:

    def apply[T](block: Database => T): Unit = {
      Databases.withInMemory(
        urlOptions = Map(
          "MODE" -> "MYSQL",
          "IGNORECASE" -> "TRUE"
        ),
        config = Map(
          "logStatements" -> false
        )
      ) {
        database =>
          Evolutions.withEvolutions(database, SimpleEvolutionsReader.forDefault(
            Evolution(
              1,
              schema,
              ""
            )
          )) {
            block(database)
          }
      }
    }
    

    但是,我建议不要在运行集成测试时使用不同的数据库引擎。尝试使用与生产环境相同的数据库,因为它会让您的测试更有信心。

    【讨论】:

    • 感谢您指出此文档。不幸的是,这不是我想要的。正如它所说,IGNORECASE 选项会影响比较数据,但它似乎对元数据(例如表名和别名)没有任何影响。
    • 另外,我同意您关于集成测试的建议,但事实并非如此。它只是为了帮助单元测试,这些单元测试通常在我们的管道中运行的部分没有现成的 MySQL 实例,例如在提交时完成的构建/测试触发器。我们的集成测试在管道中稍稍稍靠后,并使用实际的 MySQL 驱动程序完成。
    猜你喜欢
    • 2014-07-19
    • 1970-01-01
    • 2020-04-08
    • 2020-08-02
    • 1970-01-01
    • 2010-10-30
    • 2013-03-10
    • 2011-10-14
    • 2012-01-18
    相关资源
    最近更新 更多