Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用H2测试MySQL区分大小写_Mysql_Scala_Playframework 2.0_H2 - Fatal编程技术网

如何使用H2测试MySQL区分大小写

如何使用H2测试MySQL区分大小写,mysql,scala,playframework-2.0,h2,Mysql,Scala,Playframework 2.0,H2,我正在开发一个使用mysql的Scala/Play应用程序。我遇到了一个问题,当我的应用程序部署到我们的集成环境时,它会中断,因为来自我的应用程序的sql查询对于表和别名的大小写是错误的。我在开发中没有注意到这一点,因为我在Mac上,默认情况下MySQL不区分大小写。除了将本地环境配置为区分大小写之外,我还希望在编写大小写错误的查询时,单元测试失败。我正在用H2测试数据库,如。我使用以下代码设置数据库,其中schema是包含创建脚本的字符串: def apply[T](block: Databa

我正在开发一个使用mysql的Scala/Play应用程序。我遇到了一个问题,当我的应用程序部署到我们的集成环境时,它会中断,因为来自我的应用程序的sql查询对于表和别名的大小写是错误的。我在开发中没有注意到这一点,因为我在Mac上,默认情况下MySQL不区分大小写。除了将本地环境配置为区分大小写之外,我还希望在编写大小写错误的查询时,单元测试失败。我正在用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)
    }
  }
}
直观地说,配置映射会有一个选项,如
“区分大小写”->true
或类似的选项,但我无法找到所有选项的文档。有人知道H2是否有此配置选项以及它是什么吗?

这由和播放文档(基本上引用H2文档)解释:

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

和来自:

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

>,您需要更改<代码> URLOPTIONS /代码>,以考虑<代码> LIDECASE 参数:

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)
      }
  }
}
但是,我反对在运行集成测试时使用不同的数据库引擎。尽量使用生产中使用的同一个数据库,因为它会给您的测试带来更大的信心。

这是由和Play文档(基本上引用的是H2文档)解释的:

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

和来自:

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

>,您需要更改<代码> URLOPTIONS /代码>,以考虑<代码> LIDECASE 参数:

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驱动程序完成。感谢您指出此文档。不幸的是,这不是我想要的。正如它所说,IGNORECASE选项影响比较数据,但它似乎对元数据(如表名和别名)没有任何影响。此外,我同意您关于集成测试的建议,但这不是问题所在。它只是为了帮助进行单元测试,这些测试通常在我们的管道中没有现成的MySQL实例的部分中运行,例如提交时完成的构建/测试触发器。我们的集成测试更进一步,使用实际的MySQL驱动程序完成。