有玩 pgsql 的没,求一个关于大小写的解决方案的问题。

2015-01-07 01:39:42 +08:00
 cevincheung
table name , field name 全部自动转换成小写这个还能接受,本身就从来没在数据库里对表名和字段名用过大写。但是数据对大小写敏感就不淡定了。

简单的场景比如用户注册,用户名提交的是UserName,登录的时候填username就不行了。
比如:快乐的s仓鼠。那是不是说数据库里可能会存在两个这个用户名的人?一个是s,一个是S。

- -#感觉好蛋疼啊。如果统一转换成了小写。那用户信息那里,我填的是大写,你给我搞成小写,什么意思- -#。。统一大写也有这问题啊。

再比如就是email,比如 username@d.com userName@d.com 是不是我能用一个邮箱注册两个账号?还是要在程序里统一转换成小写?

有没有什么方法让丫的对大小写不敏感。
5882 次点击
所在节点    PostgreSQL
14 条回复
blacktulip
2015-01-07 01:51:14 +08:00
这个反正我是存之前 .downcase! 一下
zhangshine
2015-01-07 01:56:41 +08:00
我一般加个lower username 的unique index
O14
2015-01-07 02:29:55 +08:00
把你的query对大小写敏感的部分加上引号试试,应该是单引号,不加单引号postgres好像都会解析成小写
cevincheung
2015-01-07 02:32:52 +08:00
@zhangshine
how ?
而且这样也不行啊。注册的时候填写的用户名是 哈哈你好A 然后登录成功后在页面里显示 哈哈你好a ?
email那个统一转换小写也倒还行。

还有就是文章标题这种场景,填写的是 How to ...。然后在后台搜索how to。就搜不到这个文章了咩- -###

还有就是对国外的的姓名检索。 输入 Tom Smith。然后后台搜索的时候直接 tom 也搜不出来这货是么?
cevincheung
2015-01-07 02:33:51 +08:00
@O14
你说的是表名和字段名,那个可以接受,本来就没有给表名和字段名用大写的习惯,这样正好。现在蛋疼过的是对数据的部分。丫的区分的好难受。
ble
2015-01-07 02:46:50 +08:00
加多一个字段保存用户名的小写?
cevincheung
2015-01-07 03:06:05 +08:00
@ble
难道一定要如此蛋疼吗? - -#
cevincheung
2015-01-07 03:07:49 +08:00
@zhangshine
lower index 是不是就是说 索引全是按照小写搜索?那这样也行啊!!
怎么创建这个牛X的lower index!?@>@
cevincheung
2015-01-07 03:11:34 +08:00
找到了

CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
cevincheung
2015-01-07 03:17:09 +08:00
@zhangshine

CREATE INDEX content ON test2 USING btree (lower(content::text))

select * from test2 where content = 'fE'

content=fe的数据没有被检索出来- -#
zhangshine
2015-01-07 08:37:12 +08:00
@cevincheung http://stackoverflow.com/a/7005656
用户名存的时候还是大小写敏感的,建一个小写的unique index防止出现'fE', 'FE'的情况。
cevincheung
2015-01-07 11:53:00 +08:00
@zhangshine

折腾了一晚上没有啥解决方法。官方的回答是这样的。

sql查询,使用 select fields from table where lower(field) = 'value'
然后创建一个非unique的 lower index,让这条SQL走索引。

只有这一个方法。对email、unique username、mobile username这种场景来说,unique lower index还是可以解决问题的。


不过就是不明白,既然都已经把index都lower了,那么在检索的时候为什么大写的数据就是不能搜到?那这个lower index还有什么作用?
zhangshine
2015-01-07 12:59:15 +08:00
@cevincheung 其实我也只懂点皮毛
leedstyh
2015-01-08 06:15:12 +08:00
字段类型设置为citext,不要使用lower(field) = lower(?)这种,下面的链接有说明:

http://www.postgresql.org/docs/9.4/static/citext.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/159846

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX