nwa*_*ooi 0 java postgresql hibernate jpa case-insensitive
我目前正在做一个已经开发了几个月的 Java 项目。项目差不多完成了,现在我意识到 Postgres 是区分大小写的。
在我的登录过程中,它无法区分username和“用户名”。我使用 Java base、Hibernate 和 JPA 作为后端实现,并使用 Postgres 作为数据库。
我一直在互联网上搜索解决方案,我得到的大部分答案都是建议我使用解决方案:
select loginId from user where
lower(loginId)=loginid.toLowerCase();
Run Code Online (Sandbox Code Playgroud)
或将表列的数据类型更改为 citext。
但是有没有更快的方法来做到这一点?或者是否有任何变量Postgres.conf能够控制不区分大小写?或者在休眠状态下我可以轻松控制它?
我知道使用方法lower(loginId)=loginId.toLowerCase()是解决问题的最简单方法,但是我的项目中有很多代码需要更改,可能需要很长时间才能修复。将数据类型更改为 citext 对于很久以前实施的项目来说并不是一个很好的解决方案。
这里有人有更好的解决方案来解决我当前的问题吗?
PostgreSQL没有不区分大小写的排序规则,无论是全局的还是基于每列/运算符的。它也没有“不区分大小写”的配置选项。
您的选择是:
使用citext你想要的情况下,insitive的cols类型。如果列应始终不区分大小写,则可能是最佳选择;这就是我会做的,除非 Hibernate 有问题。重要的citext是,不区分大小写的 case-preserving,即保留大写,它们在比较中并不重要。
显式比较小写值,每个lower(col) = lower('Literal'). 不能在 上使用索引col,您必须在 上创建单独的索引lower(col)。上的唯一约束(包括主键)col不会不区分大小写;lower(col)如果你想要这个,你必须创建一个唯一的索引。这种方法是大小写保留的。
添加一个只允许小写值并拒绝大写值的CHECK约束col。如果需要,您可以将其与BEFORE INSERT OR UPDATE ... FOR EACH ROW小写输入的触发器结合使用。这样列的值只能是小写。然后,您只需确保客户端应用程序始终使用小写值进行比较。这种方法不保留大小写- 当您输入时BOB,数据库会存储bob并且以后无法知道哪个是输入。
由于您使用的是 ORM,因此您可以在模型代码中使用小写。只需让您的实体始终toLowerCase在访问器上输入和输出即可。您仍然必须记住在代码中将比较的另一侧值小写,但它不那么脆弱。同样,这不是大小写保留的。
就个人而言,我只会在适当的情况下使用 citext,这就是它的用途。
PostgreSQL 中区分大小写的全局开关只能在某个initdb时间进行 - 否则打开或关闭区分大小写会突然违反以前有效的唯一约束、违反以前有效的外键约束、中断检查约束等。它也会违反SQL 标准,需要区分大小写的操作。所以 PostgreSQL 不支持它。
什么将是有益的是,如果每列和每个运营商核对覆盖支持不区分大小写的排序规则。然而,他们没有。
| 归档时间: |
|
| 查看次数: |
3060 次 |
| 最近记录: |