2015-05-06 30 views
1

嗨,我正在尋找最高效的方式,以確保一個唯一的用戶名。 我已經檢查過類似的問題,但沒有一個讓我開心。 所以我想出了我的解決方案。我感謝您的意見。的MySQL + PHP保證唯一的用戶名(自動增加後綴)

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因爲它們是區分大小寫的。

+0

如何時間戳(YYYYMMDDHHSS)+姓氏爲唯一的用戶名呢? – scubasteve623

+0

謝謝。我更喜歡Facebook的方式(在最後添加一個數字)。由於用戶名可以在谷歌中找到。 – Vincenzo

回答

1

The docs say「非二進制字符串(CHAR,VARCHAR,TEXT),字符串搜索中使用的比較操作數的排序規則......非二進制字符串比較是區分默認情況下不區分大小寫」,所以你應該能夠做到這一點:

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

謝謝。從用戶那裏名字=「$姓名」和姓氏=「$ lastname''和它的作品'SELECT COUNT(*)作爲「計數」:我有我的查詢更新。性能如何? 1百萬行? – Vincenzo

+0

'firstname'和'lastname'都是鍵,所以你應該沒問題。 –

0

要解決的情況下,靈敏度可以使用LCASE(列)來比較小寫值:

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

你也可以使用等以檢查用戶名字段:

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

這樣 'this.name', 'this.name.1' 和 'this.name.2' 都會被計數在一起。

我認爲這兩種解決方案不會讓優化走索引的優勢,因此性能可能會下降,但可能是一個不是問題的問題。

+0

謝謝。我想使用LCASE確實會對性能產生影響。但是,Honore Doktorr解決方案無論如何正在解決小寫字母問題。 – Vincenzo