2013-11-26 120 views
0

在我的數據庫中,我有一個Varchar條目:zZzMysql - 字符串中的大寫字母

請注意大寫字母。

我讓使用輸入他們的用戶名和檢查條目。但我試圖通過完全寫入用戶名zzz使其出錯 - 請注意全部小寫。

Mysql說一切正常,並且它正在返回true,當我期待它返回false時。我究竟做錯了什麼。這裏是我的函數($ DB是一個有效的數據庫句柄):

function IsUsername($db, $Username) 
{ 
    $stmtIsUsername = $db->prepare("SELECT Username FROM members WHERE " 
       . "Username = :Username"); 
    $stmtIsUsername->execute(array(':Username' => $Username)); 
    $ret = ($stmtIsUsername && isset($stmtIsUsername) && $stmtIsUsername->rowCount() > 0) ? true : false; 
    $stmtIsUsername->closeCursor(); // mysql_free_result equivalent 
    return $ret; 
} 

在我的數據庫用戶名= ZZZ

我打電話以下($ DB是有效的)

$userInput = $_GET['username']; // Which is "zzz" 
if(IsUsername($db, $userInput)) 
{ 
    echo "All is OK"; 
} else 
{ 
    echo "The user is not valid"; 
} 

的回聲令人討厭地「一切正常」。我究竟做錯了什麼?

+0

重複:http://stackoverflow.com/questions/3936967/mysql-case-不敏感選擇 –

+0

它不是重複的。我想zZz和zzz是不同的。你的鏈接希望兩者相同。 – Rewind

回答

1

默認的字符集和排序規則是latin1和latin1_swedish_ci,所以非二進制字符串比較默認情況下不區分大小寫。這意味着如果使用col_name LIKE'a%'進行搜索,則會獲得以A或a開頭的所有列值。要使搜索區分大小寫,請確保其中一個操作數具有區分大小寫或二進制排序規則。例如,如果您要比較同時具有latin1字符集的列和字符串,則可以使用COLLATE運算符使任一操作數具有latin1_general_cs或latin1_bin歸類:

col_name COLLATE latin1_general_cs LIKE'a%' COL_NAME LIKE 'A%' COLLATE latin1_general_cs COL_NAME COLLATE latin1_bin LIKE 'A%' COL_NAME LIKE 'A%' COLLATE latin1_bin 如果你想總是在區分大小寫的方式處理列,可使用區分大小寫聲明,或二進制整理。請參見第13.1.10節「CREATE TABLE語法」。

[http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html]

+0

這聽起來像答案,但我是一個業餘愛好程序員,並沒有理解一個字。我在代碼中做什麼?剛剛看到鏈接。現在讀它 – Rewind

+0

所以我已經閱讀了鏈接,並且我可以檢查它的我的mysql代碼,它必須更改爲:$ stmtIsUsername = $ db-> prepare(「SELECT用戶名FROM成員WHERE用戶名COLLATE Latin1_General_CS_AS =:用戶名」); 我讀的是否正確。這也會讓搜索速度變慢嗎? – Rewind

+0

重讀鏈接 - 它是您告訴我要更改的表格。它現在有效。謝謝。 – Rewind

相關問題