2010-08-03 53 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。我建议你比较一下,你的里程可能会有所不同,这取决于你的实际数据和你需要运行的查询。