在MySql中保持文本大小写

本文关键字:文本 大小写 MySql | 更新日期: 2023-09-27 17:57:50

我知道标题可能会令人困惑,但在措辞上遇到了问题。如果有人能想出更好的措辞,请随时更改。

当我将值传递到MySQL中的数据库时,文本的"case"会很好地传递,以及当我检索它时,所以例如:

存储在Db中,检索时:

Username: Ben
Password: PassWord

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

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

字体大小写没有限制。有没有一种方法可以设置它,这样如果使用上面的查询,它将不会返回任何内容,但如果我使用

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

只有这样才能返回数据?

在MySql中保持文本大小写

您要查找的术语是"区分大小写"。这可以在MySQL中使用排序规则来实现,也可以在C#中使用带有可选StringComparison参数的StringInstance.Equals方法来实现。通常,编程语言在字符串比较中区分大小写,而数据库查询语言不区分大小写(更确切地说,默认排序规则不区分大小字母),因此这可能会非常令人困惑。

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

示例:

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

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

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

示例:

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

这将导致生成的查询包含正确的排序规则代码。

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

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

试试这个

很抱歉把它弄混了:

首先,以纯文本形式存储密码是一个非常非常糟糕的主意,因为如果你的服务器被泄露,你所有的用户密码都可能被用来劫持其他地方的用户帐户。

你可以使用散列(是的,我知道,它也被破坏了,但更安全一点):

 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作为密码,并使其区分大小写。

对于用户名大小写敏感性,请尝试:

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