簡體   English   中英

在MySql中保持文本的大小寫

[英]Keeping text upper and lower case in MySql

我了解標題可能會造成混淆,措辭困難。 如果有人可以提出更好的措辭,請隨時進行更改。

當我將值傳遞到MySQL中的數據庫時,文本的“大小寫”會很好地傳遞,以及在我檢索它時,例如:

Username: Ben
Password: PassWord

但是當我查詢它時,我可以搜索

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

並且對字體大小寫沒有限制。 有沒有一種方法可以設置它,以便如果使用上面的查詢,它將不返回任何內容,但是如果我使用

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

僅此將返回數據?

您要查找的術語是“區分大小寫”。 這可以在MySQL中使用排序規則,或者在C#中使用StringInstance.Equals方法及其可選的StringComparison參數來實現。 通常,編程語言在字符串比較中區分大小寫,而數據庫查詢語言則不區分大小寫(更恰當地說,默認排序規則不區分大小寫),因此這可能會造成混亂。

如果要在SQL查詢本身中執行此操作,則需要在查詢中整理字符串。

例:

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

查看相關的SO問題 (在PHP中,但仍使用MySQL)

如果要從EntityFramework等生成查詢,則需要使用StringComparsion.Ordinal的somestring.Equals(someOtherString)方法。

例:

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

這將導致生成的查詢包含正確的整理代碼。

如果要比較case sensitive字符串,請使用Collat​​ion 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 -hash!

這樣做的問題是,密碼至少要保持區分大小寫,至少在插入之前您不希望密碼大寫/小寫。

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

可以使用,但是由於字符集僅限於小寫字母alpha,因此可以減少哈希熵。 您也應該避免這種情況。

清除:使用Hasing作為密碼,並使其區分大小寫。

對於區分大小寫的用戶名,請嘗試:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM