Java的Collator具有与MySQL的utf8_general_ci排序规则类似的特性。

3
有没有与MySQL的utf8_general_ci具有相同特性的Collator实现?我需要一个不区分大小写且不区分德语umlauts(如ä和a)的Collator。 背景: 我们最近遇到了一个bug,它是由表中错误的collation引起的。使用的collation是utf8_general_ci,而正确的应该是utf8_bin。特定的列有唯一索引。utf8_general_ci collation不区分像pöker和poker这样的单词,所以行被合并,这是不希望的。现在,我需要一种方法来为我们的Java应用程序实现一个模块,修复错误的行。

将特定列(唯一索引列)的排序规则更改为utf8_bin - Kunal Surana
我们已经完成了那个。剩下的问题是修复现有的行。应用程序需要使用原始数据重建这些有问题的行。 - Benjamin
如果您需要大小写折叠,但需要考虑重音敏感性,请在http://bugs.mysql.com上提交请求。 - Rick James
1个回答

3
您可以使用以下排序器:
Collator collator = Collator.getInstance();
collator.setStrength(Collator.PRIMARY);

拥有这种强度的字符排序器只会在比较时考虑主要差异。

考虑一个例子:

System.out.println(compare("abc", "ÀBC", Collator.PRIMARY)); //base char
System.out.println(compare("abc", "ÀBC", Collator.SECONDARY)); //base char + accent
System.out.println(compare("abc", "ÀBC", Collator.TERTIARY)); //base char + accent + case
System.out.println(compare("abc", "ÀBC", Collator.IDENTICAL)); //base char + accent + case + bits

private static int compare(String first, String second, int strength) {
   Collator collator = Collator.getInstance();
   collator.setStrength(strength);
   return collator.compare(first, second);
}

输出结果如下:
0
-1
-1
-1

请查看以下链接以获取更多信息:

http://www.javapractices.com/topic/TopicAction.do?Id=207 https://docs.oracle.com/javase/7/docs/api/java/text/Collator.html#PRIMARY


1
请注意,通过使用 Collator.getInstance();,您将无法确定实际获得的排序器是什么... 我建议选择并明确指定一个 Locale... 那么问题来了... 选择哪个 Locale 呢?按照现有情况,如果计算机设置为法语或德语,则此代码将选择法语或德语区域设置... 这可能没问题,或者可能需要用户更改其 Windows 设置才能在程序中获得正确的结果... - Stijn de Witt
1
还可以查看这篇博客文章:在Java中使用MySQL排序规则 - Stijn de Witt
1
另外可以参考这个SO问题:https://dev59.com/0ZHea4cB1Zd3GeqPrJRY - Stijn de Witt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接