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

MySQL + PHP ensure unique username (auto increment suffix)

您好,我正在寻找确保唯一用户名的最有效方法。 我确实已经检查过类似的问题,但 none 个问题让我很高兴。 所以在这里我想出了我的解决方案。感谢您的评论。

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.lastnameunique_username 包含 firstname.lastname.(count of equal usernames)

为了获得相同用户名的数量,我正在对用户执行以下查询 table(在插入之前)。

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

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

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

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

为了避免区分大小写,您可以使用 LCASE(column) 来比较小写值:

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' 都会一起计算。

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