Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Postgres不区分大小写_Java_Hibernate_Postgresql_Jpa_Case Insensitive - Fatal编程技术网

Java Postgres不区分大小写

Java Postgres不区分大小写,java,hibernate,postgresql,jpa,case-insensitive,Java,Hibernate,Postgresql,Jpa,Case Insensitive,我目前正在做一个Java项目,这个项目已经开发了几个月。这个项目几乎完成了,现在我意识到Postgres是区分大小写的 在我的登录过程中,它无法区分用户名和用户名。我使用Javabase、Hibernate和JPA作为后端实现,使用Postgres作为数据库 我一直在互联网上搜索解决方案,我得到的大多数答案都是建议我使用解决方案: select loginId from user where lower(loginId)=loginid.toLowerCase(); 或者将表列的数据类型更改

我目前正在做一个Java项目,这个项目已经开发了几个月。这个项目几乎完成了,现在我意识到Postgres是区分大小写的

在我的登录过程中,它无法区分用户名和用户名。我使用Javabase、Hibernate和JPA作为后端实现,使用Postgres作为数据库

我一直在互联网上搜索解决方案,我得到的大多数答案都是建议我使用解决方案:

select loginId from user where 
lower(loginId)=loginid.toLowerCase();
或者将表列的数据类型更改为citext

但是有没有更快的方法呢?或者Postgres.conf中是否有能够控制不区分大小写的变量?还是在冬眠状态下我能轻松控制它

我知道使用方法lowerloginId=loginId.toLowerCase是解决问题的最简单的方法,但我需要在项目中更改很多代码,这可能需要很长时间才能解决。将数据类型更改为citext对于很久以前实施的项目来说并不是一个好的解决方案

这里有人有更好的解决方案来解决我当前的问题吗?

PostgreSQL,可以是全局的,也可以是基于每列/操作员的。它也没有区分大小写的关闭配置选项

你的选择是:

在需要case-insitive的cols上使用citext类型。如果列始终不区分大小写,则可能是最好的选择;这就是我要做的,除非Hibernate有问题。重要的是,citext不区分大小写,保留大小写,即保留大写字母,但在比较中它们并不重要

按照lowercol=lower“Literal”显式比较小写的大小写值。无法在col上使用索引,必须在lowercol上创建单独的索引。包含col上主键的唯一约束不区分大小写;如果需要,您必须在lowercol上创建唯一索引。这种方法是保持大小写的

在col上添加一个检查约束,该约束只允许小写值,而拒绝大写值。您可以在插入或更新之前将其与。。。对于每一行触发器,如果需要,可以降低输入的大小写。这样,列的值只能是小写。然后,您只需确保客户端应用程序始终使用较低的大小写值进行比较。这种方法不是保留大小写的——当您输入BOB时,数据库存储BOB,以后无法知道输入的是哪一个

因为您使用的是ORM,所以可以在模型代码中使用小写。只要让您的实体始终在访问器上使用小写输入和输出即可。您仍然需要记住在代码中对比较的另一端值进行小写,但这样就不那么脆弱了。同样,这不是保留案例

就我个人而言,我只会在适当的地方使用citext,这就是它的用途

PostgreSQL中区分大小写的全局切换只能在initdb时间进行-否则打开或关闭区分大小写会突然导致违反以前有效的唯一约束、违反以前有效的外键约束、中断检查约束等。这也会违反SQL标准,这需要区分大小写的操作。所以PostgreSQL不支持它


如果每列和每运算符排序规则覆盖支持的不区分大小写的排序规则,则会很有用。但是,他们没有。

您可以尝试一下,看看它是否适合您。我建议在修复程序之前,将其用作临时变量

SELECT loginID 
FROM user 
WHERE (SELECT CHAR_LENGTH(REGEXP_REPLACE(loginId,*loginId from java*,'','ig')) = 0)
如果loginID匹配而不检查大小写敏感度,则应该为您提供loginID。此外,如果您有多个相同的登录,但情况不同,那么这将不适用于您

下面是使用数据库中的一个测试表的输出示例。用户名在我的表中都是大写的

select username from test.person where (select char_length(regexp_replace(username,'jMeRlOs','', 'ig')) = 0)

结果:

您的想法是正确的,您只需要一个基于lowerloginId的表达式索引。看

有关基于表达式的索引的详细信息。在您的情况下,您需要创建:

在tablename lowerloginId上创建索引tablename\u lowerloginId\u idx

如果您已经有了不这样做的代码,您可以重命名您的表并创建一个视图。然后,您的代码将从视图中读取数据,但仍然需要更改写入的表的名称


还有一点需要注意:对于loginId,最好只存储小写值,如另一个答案中所述。也许您可以创建一个新列,并将所有小写loginId复制到新列中,然后设置一个约束以确保没有新的无效条目进入。然后将旧列替换为新列,并确保只将小写值传递给后端。

看看@ankur singhal:关于编辑,使用反勾号的内联代码格式适用于代码和控制台I/O。通常不建议将其作为一般高亮显示或 像Postgres这样的技术——只需使用首字母大写,或使用首字母大写。谢谢