具有与 MySQL 的 utf8_general_ci 排序相似特征的 Java Collat​​or

Posted

技术标签:

【中文标题】具有与 MySQL 的 utf8_general_ci 排序相似特征的 Java Collat​​or【英文标题】:Java Collator with similar characteristic as MySQLs utf8_general_ci collation 【发布时间】:2016-07-09 04:11:16 【问题描述】:

是否有任何Collator 实现与 mysql 的 utf8_general_ci 具有相同的特征?我需要一个不区分大小写且不区分德语变音符号如ä 和元音a 的整理器。

背景: 我们最近遇到了一个错误,它是由我们的表中的错误排序规则引起的。使用的排序规则是utf8_general_ci,其中utf8_bin 是正确的排序规则。特定列具有唯一索引。 utf8_general_ci 排序规则不区分 pökerpoker 之类的词,因此合并了行,这是不希望的。 我现在需要一种方法来为我们的 Java 应用程序实现一个模块,它可以修复错误的行。

【问题讨论】:

将特定列(唯一索引列)的排序规则更改为utf8_bin 我们已经这样做了。剩下的问题是修复现有的行。应用程序需要使用原始数据重建那些错误的行。 如果您需要大小写折叠,但需要区分重音,请通过bugs.mysql.com 提出请求。 【参考方案1】:

您可以使用以下整理器:

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

【讨论】:

请注意,通过使用Collator.getInstance();,您将取决于实际获得的整理者...我建议选择并明确指定Locale...然后问题就变成了...什么语言环境?就目前而言,如果运行它的计算机设置为这些设置,则此代码将选择法语或德语区域设置......可能没问题,或者可能需要您的用户更改他们的 Windows 设置以在您的程序中获得正确的结果。 .. 另见这篇博文:Using MySQL Collations in Java 另见此问题:***.com/questions/33999947/…

以上是关于具有与 MySQL 的 utf8_general_ci 排序相似特征的 Java Collat​​or的主要内容,如果未能解决你的问题,请参考以下文章

mysql设置编码为UTF8,设置表为UTF8。

具有多个输入 php mysql 的自动完成搜索表单

具有多列的基于 MySQL 游标的分页

MySQL触发器将日期插入具有唯一匹配ID的行

具有高级属性的MySQL连接,如program_name。

如何删除具有特定前缀的所有 MySQL 数据库?