MySQL: SELECT语句是否区分大小写?

有人能告诉我,如果MySQL SELECT查询是大小写敏感或默认不区分?如果不是,我要发送什么查询,这样我就可以做一些事情:

SELECT * FROM `table` WHERE `Value` = "iaresavage"

实际上,Value的实际值是IAreSavage

349748 次浏览

它们是不分大小写,除非你做了二进制比较

您可以小写的值和传递的参数:

SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage")

另一种(更好的)方法是使用COLLATE操作符,如前面所说的在文档中

您选择的排序规则集是否区分大小写。

使用二进制

这是一个简单的选择

SELECT * FROM myTable WHERE 'something' = 'Something'

= 1

这是一个二进制选择

SELECT * FROM myTable WHERE BINARY 'something' = 'Something'

SELECT * FROM myTable WHERE 'something' = BINARY 'Something'

= 0

WHERE短语中的字符串比较不区分大小写。你可以试着比较使用

WHERE `colname` = 'keyword'

WHERE `colname` = 'KeyWord'

你会得到相同的结果。这是MySQL的默认行为。

如果你想让比较值为区分大小写的,你可以像这样添加COLLATE:

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'
SQL会给出不同的结果: WHERE colname COLLATE latin1_general_cs = 'keyword'

latin1_general_cs是大多数数据库中常见或默认的排序规则。

还要注意,在Linux上表名是区分大小写的,除非你将lower_case_table_name配置指令设置为1。这是因为在Linux中表是由区分大小写的文件表示的。

尤其要注意在不区分大小写的Windows上开发,并将其部署到生产环境中。例如:

"SELECT * from mytable"

除非设置了上面提到的指令,否则myTable在Windows中会成功,但在Linux中会失败。

此处引用:http://dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitivity.html

当列使用以_ci结尾的排序规则时,比较符为不分大小写(例如默认的 latin1_general_ci排序规则);当列使用以_cs_bin结尾的排序规则时,比较符为区分大小写的(例如utf8_unicode_csutf8_bin排序规则)。

检查整理

你可以使用以下方法检查你的服务器数据库连接排序:

mysql> show variables like '%collation%';
+----------------------+-------------------+
| Variable_name        | Value             |
+----------------------+-------------------+
| collation_connection | utf8_general_ci   |
| collation_database   | latin1_swedish_ci |
| collation_server     | latin1_swedish_ci |
+----------------------+-------------------+

并且你可以使用以下方法检查你的表格排序:

mysql> SELECT table_schema, table_name, table_collation
FROM information_schema.tables WHERE table_name = `mytable`;
+----------------------+------------+-------------------+
| table_schema         | table_name | table_collation   |
+----------------------+------------+-------------------+
| myschema             | mytable    | latin1_swedish_ci |

改变排序

您可以更改您的数据库,表或列排序规则为区分大小写,如下所示:

-- Change database collation
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin;


-- or change table collation
ALTER TABLE `table` CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;


-- or change column collation
ALTER TABLE `table` CHANGE `Value`
`Value` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_bin;

您的比较现在应该是区分大小写的。

试一试:

order by lower(column_name) asc;

默认不区分大小写,但是 下一个最重要的事情 您应该看看该表是如何创建的 首先,因为你可以指定大小写 创建表时的敏感性。< / p >

下面的脚本创建一个表。 注意在底部,它说COLLATE latin1_general_cs。 结尾的cs表示区分大小写。 如果你想要 表是不区分大小写的,你要么保留它

.使用COLLATE latin1_general_ci
   CREATE Table PEOPLE (


USER_ID  INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,


FIRST_NAME  VARCHAR(50) NOT NULL,
LAST_NAME  VARCHAR(50) NOT NULL,


PRIMARY KEY (USER_ID)


)


ENGINE=MyISAM DEFAULT CHARACTER SET latin1
COLLATE latin1_general_cs AUTO_INCREMENT=0;

如果你的项目是这样的,你可以创建你的 自己的表,那么指定您的 在创建表时选择大小写。< / p >

你可以试试。

SELECT * FROM `table` WHERE `Value` COLLATE latin1_general_cs = "IAreSavage"

带有二进制标志设置的字符串字段将始终区分大小写。 如果你需要对非二进制文本字段进行区分大小写的搜索,请使用以下方法: SELECT 'test' REGEXP BINARY 'test' AS RESULT

Marc B的答案是主要是正确。

如果你使用的是非二进制字符串(CHAR, VARCHAR, TEXT),比较是不区分大小写,根据默认的排序规则。

如果你使用的是二进制字符串(binary, VARBINARY, BLOB),比较是区分大小写的,所以你需要像其他答案中描述的那样使用LOWER

如果不使用默认排序规则,而使用非二进制字符串,则大小写敏感性由所选的排序规则决定。

来源:https://dev.mysql.com/doc/refman/8.0/en/case-sensitivity.html。仔细地阅读。还有一些人误解了这一点,认为比较必须区分大小写或不敏感。事实并非如此。

在我的情况下,二进制或整理或字符集工作与我的UTF8表。

我的表中有像henry, henry, susan, susan or susan 这样的用户名,并通过比较名称的字节序列来查找相应的用户。

下面的函数创建字节序列:

function makeByteString($string){
$tmp = "";
for($i=0;$i<strlen($string);$i++){
$sign = substr($string,$i,1);
$tmp.=ord($sign);
}
return $tmp;
}

SQL查询找到正确的id:

$sql = "SELECT id, username FROM users WHERE `username` = ? ";
$stmt = $conn->prepare($sql);
$stmt->execute([$strUsername]); //e.g. susan, Susan or suSan
$rows = $stmt->rowCount();
if($stmt && $rows>0){
while ($row = $stmt->fetch()) {
if(makeByteString($strUsername) ==
makeByteString(trim($row["username"]))){
$id = $row['id'];
}
}
}