在mysql

时间:2018-12-08 04:00:33

标签: php mysql database

所以我正在使用互联网服务,在我的数据库中,我有一个users表。我想索引电子邮件列,但是遇到了索引不同长度的字符串的问题。

所以我想到了一个解决方案, 我创建了另一个类型为int的列,在存储用户记录之前,我将其电子邮件转换为电子邮件字符的ascii值之和。仅当我知道以前没有人使用过同一封电子邮件时,我才创建总和,因此该字符串不可能相同。

但是我想知道总和仍然可以匹配其他记录。我想知道不同电子邮件的总和有什么机会。

如果这行得通,我可以轻松地为索引列建立索引。

这是我用来将电子邮件字符串转换为int的算法。

String email="testing@test.com"; // Allowed characters: 0-9 A-B a-b + - . _

    int sum=0;

    for(int i=0;i<email.length();i++){
        int ch=(int)email.charAt(i);
        if(ch>47 && ch<58){
            sum+=ch;
        }else if(ch>96 && ch<123){
            sum+=ch;
        }else if(ch>64 && ch<91){
            sum+=ch;
        }else if(ch==43 || ch==45 || ch==46 || ch==95 || ch==64){
            sum+=ch;
        }else{
            sum=0;
            break;
        }
    }

    System.out.println(sum);

2 个答案:

答案 0 :(得分:2)

假设我们要为电子邮件地址建立索引,以确保没有重复的电子邮件地址,因此没有用户,因此您不能使用哈希或总和,因为您有时会遇到冲突。

即使可能性很小-也并不意味着它不可能发生。当发生这种情况时-没有人知道为什么该软件无法正常工作-对于该“冲突用户”,甚至更糟的是,用户可以接管帐户。

这就是为什么,无论如何我都强烈建议在电子邮件地址上放置一个数据库索引。

这很容易,并且可以在所有情况下独立工作。

创建表将避免重复,并且易于实现(关键字:“ UNIQUE KEY”):

CREATE TABLE IF NOT EXISTS `test` (
  `email_address` varchar(250) COLLATE latin1_german2_ci NOT NULL,
  UNIQUE KEY `email_address` (`email_address`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci;

测试记录是否已经存在也很容易:

SELECT * FROM `test` WHERE email_address = "abc@google.com"

根据fyrye的评论,我选择的排序规则(以“ ci”结尾,不区分大小写)的使用允许存储区分大小写。但是要避免插入大小写不同的重复电子邮件地址(大写/小写)。

示例:该表已包含电子邮件地址为“ AbCd@mysql.com”的记录,然后为

INSERT INTO `db1080787-1`.`test` (
`email_address`
)
VALUES (
'abCd@mysql.com'
)

将导致

#1062 - Duplicate entry 'abCd@mysql.com' for key 'email_address

答案 1 :(得分:0)

在索引电子邮件字段本身时没有出现问题。它甚至可以是部分索引,大小为10或接近该值。

ascii字符的总和将导致很多很多冲突。您最好对电子邮件进行散列,然后将散列存储为二进制甚至是整数。