MariaDB和Java应用程序之间的排序规则不匹配

时间:2018-03-28 13:46:28

标签: java mariadb comparator collation

我的应用程序执行两个单独的查询来接收两个独立的数据列表,这些列表是通过在几列上排序它们来接收的,即sortkey。

// Get input1 from the DB (sorted on input1.row.sortkey)
// Get Input2 from the DB (sorted on input2.row.sortkey)
// Get the first row from input1 => input1.row
// Get the first row from input2 => input2.row
// Loop until input1 and input2 have been exhausted.
//    Compare input1.row.sortkey with input2.row.sortkey
//    if input1.row.sortkey == input2.row.sortkey
//       update existing data
//    else if input1.row.sortkey > input2.row.sortkey
//       insert new data
//    else // thus input1.row.sortkey < input2.row.sortkey
//       deprecate old data
//    endif
//    Get the next row from input1
//    Get the next row from input2

现在这个步骤出现问题:

Compare input1.row.sortkey with input2.row.sortkey

数据库中两个键的排序顺序在java代码中完成不同。

在MariaDB中,我们使用字符集UTF8(应该是UTF8mb4但不可能转换a.t.m.),并使用排序规则UTF8_general_ci作为排序规则。

一个例子是:

在数据库中, 0BSwN39hRWmg6goA0BGPDQ 之类的密钥被认为优先于 0b_4GHGyQyKKyuXY-TBnwA ,但对于java,反之亦然。

如何协调这种行为?任何解决方案都可以。我已经调查了RuleBasedCollat​​or的可能性,但这需要我定义整个校对图表。

2 个答案:

答案 0 :(得分:0)

(评论太长)

B是否应该小于b?如果是这样,您需要utf8_bin整理。

S是否应该小于&#39; _&#39;?任何utf8校对都可以。

但是...

您的算法(我认为)不正确...您不应该每次都获得两个新行;情况2和3需要仅从一个输入流中获取新的输入行。

答案 1 :(得分:0)

为了解决这个问题,我刚刚将_字符翻译成了java中的Character.MAX_VALUE。这使得比较对我有用,但这只是因为我的排序键可以具有的一组可能的字符(a-zA-Z,0-9, - 和_)。不保证这适用于其他符号或特殊字符。