2013-11-26 123 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

相关问题