谁能告诉我SELECT
默认情况下MySQL 查询是否区分大小写?如果没有,我将要发送什么查询,以便执行以下操作:
SELECT * FROM `table` WHERE `Value` = "iaresavage"
实际上,的真正价值Value
是IAreSavage
。
'value' in ('val1', 'val2', 'val3')
谁能告诉我SELECT
默认情况下MySQL 查询是否区分大小写?如果没有,我将要发送什么查询,以便执行以下操作:
SELECT * FROM `table` WHERE `Value` = "iaresavage"
实际上,的真正价值Value
是IAreSavage
。
'value' in ('val1', 'val2', 'val3')
Answers:
除非您进行二进制比较,否则它们不区分大小写。
您可以小写值和传递的参数:
SELECT * FROM `table` WHERE LOWER(`Value`) = LOWER("IAreSavage")
另一种(更好)的方法是使用文档中COLLATE
所述的运算符
SELECT
使用该语句将如何显示COLLATE
?
LOWER()
或任意COLLATE
子句可以完全绕过索引,并且随着时间的流逝,随着表的增长,这可能会对性能产生巨大影响。这些可能是您要查找的用户名?使用不区分大小写的排序规则,并向该列添加唯一索引。使用EXPLAIN
以确认正在使用的索引。
使用二进制
这是一个简单的选择
SELECT * FROM myTable WHERE 'something' = 'Something'
= 1
这是带有二进制的选择
SELECT * FROM myTable WHERE BINARY 'something' = 'Something'
要么
SELECT * FROM myTable WHERE 'something' = BINARY 'Something'
= 0
比较是不区分大小写当列使用其结尾的对照_ci
(如缺省 latin1_general_ci
排序规则),并且它们是大小写敏感的,当列使用的对照,其端部与_cs
或_bin
(如utf8_unicode_cs
和utf8_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;
现在,您的比较应该区分大小写。
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
在大多数数据库中是常见或默认排序规则。
默认值是不区分大小写的,但是接下来要看的最重要的事情是表是如何创建的,因为在创建表时可以指定区分大小写。
下面的脚本创建一个表。请注意,底部显示“ 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;
如果您的项目可以创建自己的表,则在创建表时指定区分大小写的首选项是有意义的。
SQL Select不区分大小写。
该链接可以向您显示如何区分大小写:http : //web.archive.org/web/20080811231016/http : //sqlserver2000.databases.aspfaq.com : 80/ how-can-i-make- my- sql-queries-case-sensitive.html
还要注意,在Linux上,表名区分大小写,除非将lower_case_table_name
config伪指令设置为1。这是因为表由Linux区分大小写的文件表示。
尤其要注意在不区分大小写的Windows上进行的开发,并将其部署到实际的生产环境中。例如:
"SELECT * from mytable"
除非已设置上述指令,否则针对表myTable的表将在Windows中成功但在Linux中失败。
此处参考:http : //dev.mysql.com/doc/refman/5.0/en/identifier-case-sensitiveivity.html
lower_case_table_name
按照我们在以下评论中给出的答案中指定的进行更改
当前接受的解决方案大部分是正确的。
如果您使用非二进制字符串(CHAR,VARCHAR,TEXT),则根据默认排序规则,比较不区分大小写。
如果您使用二进制字符串(BINARY,VARBINARY,BLOB),则比较区分大小写,因此您需要LOWER
按照其他答案中的描述使用。
如果您没有使用默认排序规则,而是使用非二进制字符串,则区分大小写取决于所选的排序规则。
来源:https : //dev.mysql.com/doc/refman/8.0/en/case-sensitiveivity.html。仔细阅读。其他一些人则误以为比较必须区分大小写或不区分大小写。不是这种情况。