在MySql中保持文本大小写

时间:2014-04-10 02:47:24

标签: c# mysql case-sensitive

我理解标题可能会令人困惑,因此无法用语言表达。如果有人能够提出更好的措辞,请随时改变它。

当我将值传递给MySQL中的数据库时,文本的“大小写”传递得很好,以及当我检索它时,例如:

存储在Db中,并在检索时:

Username: Ben
Password: PassWord

但是当我查询它时,我可以搜索

SELECT * FROM TableName WHERE Username = 'ben' AND Password = 'password';

对字体大小写没有限制。有没有办法设置它,以便如果使用上述查询,它将不返回任何内容,但如果我使用

SELECT * FROM TableName WHERE Username = 'Ben' and Password = 'PassWord';

这只会返回数据吗?

3 个答案:

答案 0 :(得分:3)

您正在寻找的术语是"区分大小写"。这可以使用排序规则在MySQL中完成,也可以使用StringInstance.Equals方法在C#中使用它的可选StringComparison参数完成。通常,编程语言在字符串比较中区分大小写,而数据库查询语言不区分大小写(更正确地说,默认排序规则不区分大小写),因此这可能非常混乱。

如果要在SQL查询本身中执行此操作,则需要collate查询中的字符串。

示例:

SELECT * FROM table WHERE Password = 'PassWord' COLLATE utf8_bin

参见相关的SO question(在PHP中,但仍在使用MySQL)

如果从EntityFramework生成查询,则需要使用带StringComparsion.Ordinal的somestring.Equals(someOtherString)方法。

示例:

MyObject obj = someQueryable.FirstOrDefault(q => q.Password.Equals("PassWord", StringComparison.Ordinal));

这将导致生成的查询包含正确的归类代码。

答案 1 :(得分:0)

如果您想比较字符串case sensitive,请使用排序规则latin1_bin。默认排序规则为latin1_swedish_ci,不区分大小写。

SELECT * FROM 
       TableName 
              WHERE Username COLLATE latin1_bin = 'Ben' 
               AND Password COLLATE latin1_bin = 'PassWord';

试试这个

答案 2 :(得分:-3)

很抱歉混淆:

首先,以明文形式存储您的密码是一个非常糟糕的主意,因为如果您的服务器遭到入侵,所有用户密码都可以用来劫持用户的其他地方的帐户

你可以使用哈希(是的,我知道,它也受到了损害,但更安全一点):

 SELECT * FROM table WHERE Username = 'Ben' AND Password = SHA1('PassWord')

然后你必须将它插入sha1 - 哈希!

问题是,密码将保持区分大小写,至少如果你在插入之前不会降低/大写它。

INSERT INTO table (Username, Password) VALUES ('Ben', SHA1(LOWER('PassWord'));
SELECT * FROM table WHERE Username = 'Ben' AND Password =  SHA1(LOWER('PassWord')); 

会起作用,但它会减少散列熵,因为字符集仅限于小写字母。 你应该避免这样做。

清除:使用Hasing作为密码,并保留CASE SENSITIVE。

对于用户名案例敏感性尝试:

SELECT * FROM table WHERE LOWER(Username) = LOWER('BeN');