在Java中使用MySQL排序规则 短版

在Java中使用MySQL排序规则 短版,java,mysql,hibernate,collation,Java,Mysql,Hibernate,Collation,我目前正在研究MySQL排序规则的一个问题,以及它们如何影响一组值(使用Hibernate映射,但现在这不重要)。我希望有一组字符串使用与MySQL相同的排序规则。例如,我希望“foobar”和“föbar”被认为是平等的,但“foobar”和“foobar”被认为是不同的。使用default(带strength)并不可靠,因为仍然存在差异(最明显的是空格)。那么,对于每个可能的字符串,如何获得一个行为与MySQL相同的Collator呢 长版本 我希望在表上有一个唯一的索引,在表中存储集合的值

我目前正在研究MySQL排序规则的一个问题,以及它们如何影响一组值(使用Hibernate映射,但现在这不重要)。我希望有一组字符串使用与MySQL相同的排序规则。例如,我希望“foobar”和“föbar”被认为是平等的,但“foobar”和“foobar”被认为是不同的。使用default(带strength)并不可靠,因为仍然存在差异(最明显的是空格)。那么,对于每个可能的字符串,如何获得一个行为与MySQL相同的Collator呢

长版本 我希望在表上有一个唯一的索引,在表中存储集合的值,并确保集合只保存DB中允许的值,反之亦然

表如下所示:

CREATE TABLE `MY_SET` (
  `entity_id` int  NOT NULL,
  `value` varchar(255)  NOT NULL,
  UNIQUE `entity-value`(`entity_id`, `value`)
) ENGINE = InnoDB DEFAULT CHARSET=latin1 DEFAULT COLLATION=;
现在,如果我使用普通字符串和哈希集来保存我的值,例如

public class MyValues {
  private MyEntity _myEntity;
  private final HashSet<String> _values = new HashSet<String>();
}
但不适用于MySQL认为不同的“foobar”和“foobar”:

v.getValues().add(new CollatedString("foobar"));
v.getValues().add(new CollatedString("foo bar"));
System.out.println("2 == " + v.getValues().size()); // prints 2 == 1 (which is wrong)
基本上,剩下要做的就是实现getCollator()方法:


示例的完整代码可用:

我已经设法让一些东西自己工作。由于我无法让内置的collator实现我想要的功能,我决定自己实现一些东西。基本思想是读取MySQL的字符集/排序规则定义文件(在我的Ubuntu系统上为/usr/share/MySQL/charsets)。另一种方法是根据这些定义为基于规则的计算器构建规则,但我决定构建自己的collator,它的功能较少(MySQL排序规则不能配置为区分大小写,或者不区分大小写,或者是区分大小写),并且应该表现得很好。

啊,作为一名真正的专家,我感到很难过。我只是花了两个小时在谷歌上搜索MySQL的
unicode\u general\u ci
collation和Java的
Collator
类,但我找不到有人专门问这个问题:两者之间有什么关系?很遗憾看到你得到了0个答案和评论,但当你的专业知识远远高于一般公众时,这就是你付出的代价。好问题,希望我能给出+10!
final MyEntity e = new MyEntity();
final MyValues v = new MyValues();
v.setEntity(e);
v.getValues().add(new CollatedString("foobar"));
v.getValues().add(new CollatedString("fööbar"));
System.out.println("1 == " + v.getValues().size()); // prints 1 == 1
v.getValues().add(new CollatedString("foobar"));
v.getValues().add(new CollatedString("foo bar"));
System.out.println("2 == " + v.getValues().size()); // prints 2 == 1 (which is wrong)
public static final Collator getCollator() {
  // FIXME please help!
}