MySQL + PHP确保唯一的用户名(自动增量后缀)

时间:2015-05-06 19:05:45

标签: mysql unique username

您好我正在寻找确保唯一用户名的最高性能方式。 我确实已经检查了类似的问题,但没有一个让我开心。 所以我在这里提出了我的解决方案。感谢您的评论。

CREATE TABLE IF NOT EXISTS `user` (
`guid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

`firstname` varchar(48) NOT NULL,
`lastname` varchar(48) NOT NULL,
`username` varchar(128) NOT NULL,
`unique_username` varchar(128) NOT NULL,


PRIMARY KEY (`guid`),
KEY `firstname` (`firstname`),
KEY `lastname` (`lastname`),
KEY `username` (`username`),
UNIQUE KEY `unique_username` (`unique_username`),
UNIQUE KEY `email` (`email`)


) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

username包含firstname.lastname,不含数字后缀,而unique_username包含firstname.lastname.(count of equal usernames)

获取我在对用户表进行查询后执行的相同用户名的计数(提前插入)。

SELECT COUNT(*) FROM user WHERE username = 'username'

不幸的是,我不能对firstname and lastname使用查找,因为它们区分大小写。

2 个答案:

答案 0 :(得分:1)

The docs say“非二进制字符串(CHAR,VARCHAR,TEXT),字符串搜索使用比较操作数的排序规则...非二进制字符串比较默认情况下不区分大小写”,所以你应该能够这样做:

SELECT COUNT(*) FROM user WHERE CONCAT_WS('.', `firstname`, `lastname`) = 'username`

答案 1 :(得分:0)

为了解决大小写敏感问题,您可以使用LCASE(列)来比较小写值:

SELECT COUNT(*) FROM user 
WHERE LCASE(lastname) = LCASE('Lastname') 
  AND LCASE(firstname) = LCASE('firstName');

您还可以使用LIKE检查用户名字段:

SELECT COUNT(*) FROM user WHERE username LIKE 'username%';

那样'this.name','this.name.1'和'this.name.2'都会被计算在一起。

我认为这两种解决方案都不会让优化器利用索引,因此性能可能会下降,但可能不是问题。