V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cevincheung
V2EX  ›  PostgreSQL

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

  •  
  •   cevincheung · 2015-01-07 01:39:42 +08:00 · 6108 次点击
    这是一个创建于 3606 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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   ·   实用小工具   ·   2891 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:46 · PVG 22:46 · LAX 06:46 · JFK 09:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.