2010-08-03 56 views
24

我的Mysql數據庫中有一張表,用於進行身份驗證。現在,我需要使認證情況非常敏感。 谷歌搜索,我已經意識到MySQL列對搜索操作不區分大小寫(與甲骨文相反),通過指定「二進制」即可創建表時,可以更改默認行爲。將Mysql Table列更改爲區分大小寫

CREATE TABLE USERS 
(
    USER_ID SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, 
    USER_NAME VARCHAR(50) BINARY NOT NULL 
) 

有人可以告訴我如何改變Mysql中的表來添加「二進制」到數據庫的現有列嗎?

謝謝!

+0

您不需要將其設置爲二進制即可區分大小寫。如果它是一個varchar,只需使用collat​​ion = latin1_general_cs – Chiwda 2018-03-02 10:20:12

回答

27
ALTER TABLE USERS CHANGE USER_NAME USER_NAME VARCHAR(50) BINARY NOT NULL; 
+2

如果不更改列名,則不需要列出兩次;) – defines 2010-08-03 12:25:29

+14

要引用mysql文檔http://dev.mysql.com/doc/refman/5.1/en/alter-table.html,如果你想改變一個列的類型而不是名字,CHANGE語法仍然需要一個新的和新的列名,即使它們是相同的。「 – deinst 2010-08-03 12:33:41

+0

如果有人錯過了文檔,如果您不更改列名稱,則可以使用「MODIFY」而不是「CHANGE」。在這種情況下,您只需要提供一次列名。 – wsams 2018-02-15 20:21:25

-1

而不是改變你的表,你仍然可以在你的表進行區分大小寫的查詢進行身份驗證時,使用BINARY選項,如下所示:

SELECT BINARY * FROM USERS where USER_ID = 2 AND USER_NAME = 'someone' LIMIT 1; 

這是否幫助?

+0

基於上述,SomeOne的用戶名將返回false。 – SimonDowdles 2010-08-03 12:12:19

+4

這給每一個查詢增加了很大的開銷。如果數據必須始終以二進制形式返回,爲什麼在每次訪問時都要轉換它?這就是我們所說的「kludge」。 – defines 2010-08-03 12:17:04

+0

也許我不明白,以下聲明是否意味着未來的SENSITIVE檢查? ALTER TABLE USERS CHANGE USER_NAME USER_NAME VARCHAR(50)BINARY NOT NULL; 據我瞭解,每個登錄認證都需要區分大小寫。 – SimonDowdles 2010-08-03 12:21:53

4

你應該能夠做這樣的事情:

編輯:誤讀你究竟想要做的事:

ALTER TABLE USERS MODIFY 
    USER_NAME VARCHAR(50) 
     CHARACTER SET latin1 
     COLLATE latin1_bin; 
+0

以下方法適用於我:ALTER TABLE UserAccounts CHANGE Password Password varchar(50)NOT NULL COLLATE utf8_bin; – 2014-02-13 19:16:48

6

請參閱http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

例子:

ALTER TABLE some_table MODIFY some_column BLOB; 
ALTER TABLE some_table MODIFY some_column VARCHAR(50) BINARY; 

第一行轉換爲二進制數據類型(嘗試最小化字符損失),第二行轉換回VARCHAR類型,並使用BINARY整理。

實際上最好將其存儲爲二進制類型之一(BLOB,BINARYVARBINARY),而不是簡單地整理BINARY。我建議你比較一下,你的里程可能會有所不同,這取決於你的實際數據和你需要運行的查詢。