java mysql排序规则_在Java中使用MySQL排序规则

精简版

我目前正在研究MySQL排序规则的问题以及它们如何影响一组值(使用Hibernate映射,但现在这不重要).我希望使用与MySQL使用相同的排序规则来设置一组字符串.例如.我希望“foobar”和“fööbar”被认为是平等的,但“foo bar”和“foobar”被认为是不同的.使用默认值Collator.getInstance()(具有Collator.PRIMARY强度)不能可靠地工作,因为仍然存在差异(最明显的是空白).那么如何为每个可能的String获得一个与MySQL一样的Collat​​or?

长版

我希望在表上有一个唯一的索引来存储Set的值,并确保Set只保存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=;

现在,如果我使用纯字符串和HashSet来保存我的值,例如如在

public class MyValues {

private MyEntity _myEntity;

private final HashSet _values = new HashSet();

}

可以在这组值中添加“foobar”和“fööbar”.现在,如果Hibernate将Set刷新到数据库,MySQL会抱怨“foobar”和“fööbar”对于定义的“entity-value”键重复.因此,我认为我包装了字符串并使用Collator检查字符串是否相等:

public class MyValues {

private MyEntity _entity;

private final HashSet _values = new HashSet();

}

public static class CollatedString {

private String _string;

private CollationKey _key;

public String getString() {

return _string;

}

public void setString(final String string) {

_string = string;

_key = getCollator().getCollationKey(_string);

}

@Override

public int hashCode() {

return _key.hashCode();

}

@Override

public boolean equals(final Object obj) {

if (!(obj instanceof CollatedString)) {

return false;

}

return _key.equals(((CollatedString) obj)._key);

}

}

这适用于“foobar”和“fööbar”:

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

但是对于MySQL认为不同的“foo bar”和“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)

基本上剩下要做的是实现getCollat​​or()方法:

public static final Collator getCollator() {

// FIXME please help!

}

该示例的完整代码可用:Download

解决方法:

我已经设法让自己有所作为.由于我无法建立Collat​​ors来做我想做的事情,所以我决定自己实施一些东西. I’ve posted my findings on my blog.基本思想是阅读MySQL的characterset / collat​​ion定义文件(我的Ubuntu系统上的/usr/share / mysql / charsets).另一种方法是从这些定义为RuleBasedCollat​​or构建规则,但我决定构建自己的collat​​or,它具有较少的功能(MySQL collat​​ion不能配置为区分大小写或不是 – 它们是或者是不)并且应该表现得很好.

标签:java,mysql,hibernate,collation

来源: https://codeday.me/bug/20190705/1385958.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值