MySQL不区分大小写选择

Noo*_*ath 226 mysql select

任何人都可以告诉我SELECT默认情况下MySQL 的命令是否不区分大小写?如果没有,我必须发送什么命令,以便我可以执行以下操作:

SELECT * FROM `table` WHERE `Value` = "iaresavage"
Run Code Online (Sandbox Code Playgroud)

实际上,实际价值ValueIAreSavage.

Mar*_*c B 481

它们不区分大小写,除非您进行二进制比较.

  • 我不知道为什么这么多人投了这票.它在这里明确指出http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html"......这意味着对于字母字符,比较将区分大小写." 因此,如果我寻找'DickSavagewood',它就不会选择'dickavagewood'.对LOWER()做同样的事就会捡起来.所以我对这个问题的回答是:在你的特定情况下,SELECT确实是区分大小写的. (13认同)
  • @ user1961753:再次读取:"对于二进制字符串(varbinary,blob)...将区分大小写". (8认同)
  • 这应该是最受欢迎的答案 (7认同)
  • 正如Jovan所说,这取决于整理,所以这个答案是非常错误的. (4认同)
  • 我大多同意蒂姆的评论,我不认为对你的价值观做一个"低()"是处理它的最佳方式,似乎是一种解决方法.但我承认它有时候很有意义而且更容易.(科林确实提到整理更好)我们将历史数据移入mysql表,由于某些列值具有不敏感的情况,因此破坏了遗留逻辑.我们需要知道"GE1234"和"ge1234"之间的区别,它们必须是唯一的并且保持记录.我们以这种方式在create table语句中设置我们的列:varchar(20)CHARACTER SET utf8 COLLATE utf8_bin (3认同)

Col*_*ert 109

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

SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage")
Run Code Online (Sandbox Code Playgroud)

另一种(更好的)方法是使用文档中COLLATE所述的运算符

  • 这个`SELECT`语句如何使用`COLLATE`然后呢? (20认同)
  • 它在上面提到的文档页面上说,"非二进制字符串比较默认情况下不区分大小写". (11认同)
  • `WHERE`中的`LOWER(Value)`会影响性能 (9认同)
  • 有点害怕有多少人赞成这个答案.正如@Marc上面解释的那样,比较*不区分大小写.您需要了解排序规则和索引并正确配置它们 - 使用字符串转换(如`LOWER()`或任意`COLLATE`子句)可以完全绕过索引,随着时间的推移,随着表的增长,这会产生严重的性能影响.可能这些是你正在查找的用户名?使用不区分大小写的排序规则并为列添加唯一索引.使用`EXPLAIN`确认索引正在使用. (7认同)

小智 48

使用二进制

这是一个简单的选择

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

= 1

这是带二进制的选择

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

要么

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

= 0

  • 什么时候才能在=(SELECT*FROM myTable WHERE BINARY'thing'='Something')的一侧使用BINARY? (3认同)

ost*_*ach 38

当列使用以(例如默认排序规则)结束的排序规则时,比较不区分大小写,并且当列使用以或以(例如和排序规则)结尾的排序规则时,它们区分大小写._ci latin1_general_ci_cs_binutf8_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 |
+----------------------+-------------------+
Run Code Online (Sandbox Code Playgroud)

您可以使用以下方法检查表格排序:

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 |
Run Code Online (Sandbox Code Playgroud)

改变整理

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

-- 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;
Run Code Online (Sandbox Code Playgroud)

您的比较现在应区分大小写.

  • 进一步阅读:https://dev.mysql.com/doc/refman/5.7/en/case-sensitiveivity.html (2认同)
  • 这就是答案,而其他的(即使有更多的赞成票)则是解决方法。 (2认同)

Ifa*_*bal 25

WHERE短语中的字符串比较不区分大小写.您可以尝试比较使用

WHERE `colname` = 'keyword'
Run Code Online (Sandbox Code Playgroud)

要么

WHERE `colname` = 'KeyWord'
Run Code Online (Sandbox Code Playgroud)

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

如果您希望比较区分大小写,可以COLLATE像这样添加:

WHERE `colname` COLLATE latin1_general_cs = 'KeyWord'
Run Code Online (Sandbox Code Playgroud)

SQL会给出不同的结果:WHERE colnameCOLLATE latin1_general_cs ='keyword'

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

  • 谢谢你的回答,对我来说更清楚. (2认同)

chu*_*lor 16

您选择的排序规则设置是否区分大小写.


Ken*_*son 9

默认情况下不区分大小写,但您应该首先看一下表格的创建方式,因为您可以在创建表时指定区分大小写.

下面的脚本创建了一个表.请注意底部显示"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;
Run Code Online (Sandbox Code Playgroud)

如果您的项目是可以创建自己的表,那么在创建表时指定区分大小写首选项是有意义的.