有玩 pgsql 的没,求一个关于大小写的解决方案的问题。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cevincheung
V2EX    PostgreSQL

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

  •  
  •   cevincheung 2015-01-07 01:39:42 +08:00 6546 次点击
    这是一个创建于 3931 天前的主题,其中的信息可能已经有所发展或是发生改变。
    table name , field name 全部自动转换成小写这个还能接受,本身就从来没在数据库里对表名和字段名用过大写。但是数据对大小写敏感就不淡定了。

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

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

    再比如就是email,比如 [email protected] [email protected] 是不是我能用一个邮箱注册两个账号?还是要在程序里统一转换成小写?

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

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

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

    CREATE INDEX test1_lower_col1_idx ON test1 (lower(col1));
    cevincheung
        10
    cevincheung  
    OP
       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
        11
    zhangshine  
       2015-01-07 08:37:12 +08:00
    @cevincheung http://stackoverflow.com/a/7005656
    用户名存的时候还是大小写敏感的,建一个小写的unique index防止出现'fE', 'FE'的情况。
    cevincheung
        12
    cevincheung  
    OP
       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
        13
    zhangshine  
       2015-01-07 12:59:15 +08:00
    @cevincheung 其实我也只懂点皮毛
    leedstyh
        14
    leedstyh  
       2015-01-08 06:15:12 +08:00
    字段类型设置为citext,不要使用lower(field) = lower(?)这种,下面的链接有说明:

    http://www.postgresql.org/docs/9.4/static/citext.html
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2505 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 01:49 PVG 09:49 LAX 18:49 JFK 21:49
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86