首页 / JAVA / 在Java中使用MySQL排序规则
在Java中使用MySQL排序规则
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Java中使用MySQL排序规则,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2710字,纯文字阅读大概需要4分钟。
内容图文
![在Java中使用MySQL排序规则](/upload/InfoBanner/zyjiaocheng/903/54ddefbd0d8844a0b75ea6bbdeb2f564.jpg)
精简版
我目前正在研究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<String> _values = new HashSet<String>();
}
可以在这组值中添加“foobar”和“fööbar”.现在,如果Hibernate将Set刷新到数据库,MySQL会抱怨“foobar”和“fööbar”对于定义的“entity-value”键重复.因此,我认为我包装了字符串并使用Collator检查字符串是否相等:
public class MyValues {
private MyEntity _entity;
private final HashSet<CollatedString> _values = new HashSet<CollatedString>();
}
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排序规则全部内容,希望文章能够帮你解决在Java中使用MySQL排序规则所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。