非常简短的回答
撰写本文时的当前方言是:
- org.hibernate.dialect.MariaDB102Dialect 用于 MariaDB 服务器 10.2
- org.hibernate.dialect.MariaDB103Dialect 适用于 MariaDB 服务器10.3 及更高版本,提供序列支持。
- org.hibernate.dialect.MariaDB10Dialect 用于 MariaDB 服务器 10.0 和 10.1
- org.hibernate.dialect.MariaDB53Dialect,用于 MariaDB 服务器5.3 和更高的 5.x 版本。
- org.hibernate.dialect.MariaDBDialect 用于 MariaDB 服务器 5.1 和 5.2。
简答
使用 MariaDB 服务器时,您应该使用 MariaDB Connector/J 和 MariaDB Hibernate 方言,而不是 MySQL 方言。尽管 MariaDB 是作为替代品创建的,并且即使基本功能在使用 MySQL 版本时可能会起作用,但可能会出现细微的问题,或者您可能会错过某些功能。
可用 MariaDB 方言的完整列表目前未在 Hibernate 用户指南中提及,但在 Hibernate JavaDoc 中提及。 根据您的 MariaDB 服务器版本,您应该选择相应的方言版本。在撰写本文时,当前的方言是:
- org.hibernate.dialect.MariaDB102Dialect for MariaDB server 10.2
- org.hibernate.dialect.MariaDB103Dialect 用于 MariaDB 服务器 10.3 及更高版本,提供序列支持。
- org.hibernate.dialect.MariaDB10Dialect 用于 MariaDB 服务器 10.0 和 10.1
- org.hibernate.dialect.MariaDB53Dialect 用于 MariaDB 服务器 5.3 和更高的 5.x 版本。
- org.hibernate.dialect.MariaDBDialect 用于 MariaDB 服务器 5.1 和 5.2。
请注意,对于详细的使用信息,您有时需要查看方言源代码。 (部分方言源中存在非JavaDoc使用信息cmets。)
如果您想更改或明确提及 MariaDB 方言的存储引擎,您可以使用 storage_engine Hibernate 变量。例如:hibernate.dialect.storage_engine = innodb。 IMO,你应该明确地这样做,因为切换到不同的 MariaDB 服务器版本时默认值可能会改变。
如果您使用的 MariaDB 服务器早于 10.1.2(不支持小数秒),那么您可能需要将参数 useFractionalSeconds=false 提供给 JDBC URL,否则 MariaDB Connector/J 将不会截断内部时间戳,当这些值在比较查询中使用时(即使使用普通 JDBC)可能会导致时间比较问题,这可能会导致 Hibernate 版本控制问题和时间类型的乐观锁定问题。
长答案
Hibernate User Guide 中提到了 Hibernate 的 MariaDB 方言(撰写本文时为 5.3)。提到的方言“简称”后跟备注是:
但是,可以在Hibernate JavaDoc 中找到可用的官方 MariaDB 方言的完整列表。目前列出的是:
- org.hibernate.dialect.MariaDB102Dialect for MariaDB server 10.2
- org.hibernate.dialect.MariaDB103Dialect 用于 MariaDB 服务器 10.3 及更高版本,提供序列支持。
- org.hibernate.dialect.MariaDB10Dialect 用于 MariaDB 服务器 10.0 和 10.1
- org.hibernate.dialect.MariaDB53Dialect 用于 MariaDB 服务器 5.3 和更高的 5.x 版本。
- org.hibernate.dialect.MariaDBDialect 用于 MariaDB 服务器 5.1 和 5.2。
每个方言继承者都继承了以前方言版本的设置。所以 MariaDB 的继承层次是:MariaDB103Dialect > MariaDB102Dialect > MariaDB10Dialect > MariaDB53Dialect > MariaDBDialect > MySQL5Dialect > MySQLDialect > Dialect
MariaDB 被设计为 MySQL 的替代品。但随着时间的推移,数据库可能会出现分歧。大多数基本功能可能都没有问题,允许您交换 Connector/J 客户端(MySQL 服务器上的 MariaDB 客户端,反之亦然),并允许您交换方言(MariaDB 客户端上的 MySQL 方言,反之亦然)。但是有一些细微的差异可能会导致意想不到的问题。例如,MySQL Connector/J 客户端包含对服务器版本的硬编码检查,在使用 MariaDB 服务器时会失败,导致客户端中的某些功能被禁用,例如 MySQL sendFractionalSeconds 客户端参数。这将导致小数秒被禁用,因此分数将在 MySQL 客户端中被截断,但在 MariaDB 客户端中不会被截断。 (在将日期/时间类型的版本控制与非最大精度 SQL 日期/时间类型结合使用时,这甚至可能导致乐观锁定问题。在这些情况下,请使用最大精度 6。)
此外,MariaDB 方言有望为 MariaDB 提供特定功能:
http://in.relation.to/2017/02/16/mariadb-dialects/
我们将及时添加基于新功能的新方言
由 MariaDB 介绍。
...
如果您使用 MariaDB,最好使用 MariaDB-specific
从现在开始使用方言,因为它更容易匹配 MariaDB
具有相应 Hibernate 方言的版本。
https://hibernate.atlassian.net/browse/HHH-11457 说:
由于 MySQL 和 MariaDB 的发展方向不同,我们可能
也想提供 MariaDB 方言。
例如,对于 Hibernate 用户来说,计算它不是很直观
出他们需要使用 MySQLInnoDb57Dialect 来处理
具有微秒精度的时间戳,从那时起就可用
MariaDB 5.3:
Hibernate 用户指南并未提供有关如何使用方言的所有使用信息。即使是用户指南与 API 文档相结合也可能不够。有时您必须查看源代码以获取使用信息。例如,MariaDB53Dialect.java 包含可能有用的隐藏的非 JavaDoc cmets。
以前,要选择 MySQL 存储引擎,例如 MyISAM 或 InnoDB 或默认值,您可以在 MySQL57InnoDBDialect 和 MySQL57Dialect 之间切换。但他们重构了从 Hibernate 5.2.8 开始的 MySQL 方言层次结构,如 Hibernate blog post 中所述。请注意,要选择存储引擎,您应该使用环境变量或系统属性:hibernate.dialect.storage_engine。例如:hibernate.dialect.storage_engine = innodb。
XtraDB 是 MariaDB 10.1 及更早版本的默认 MariaDB 存储引擎,但从 10.2 开始它是 InnoDB。因此,在某些情况下,您可能想明确提及 Hibernate 选择的存储引擎,因此您必须使用 storage_engine 变量。关于storage_engine 变量的信息(用户指南中没有提到),可以在AvailableSettings.java 的源代码中找到。
如果您使用的 MariaDB 服务器早于 10.1.2(不支持小数秒),那么您可能需要将参数 useFractionalSeconds=false 提供给 JDBC URL,否则 MariaDB Connector/J 将不会截断内部时间戳,这可能会导致时间比较问题,这可能会导致 Hibernate 版本控制问题和时间类型的乐观锁定问题。