MySQL大小写敏感

字符串大小写敏感和Mysql的数据库的名字、表名字、字段名字、还有字段值有关。

1.和数据库名字、表名字、存储过程和触发器有关

为0时;
表示区分大小写,使用CREATE TABLE或CREATE DATABASE语句指定的大小写字母在硬盘上保存表名和数据库名。
名称比较对大小写敏感。在大小写不敏感的操作系统如windows或Mac OS x上我们不能将该参数设为0,如果在
大小写不敏感的文件系统上将--lowercase-table-names强制设为0,并且使用不同的大小写访问MyISAM表名,
可能会导致索引破坏。

为1时;
表示将名字转化为小写后存储,名称比较对大小写不敏感。MySQL将所有表名转换为小写在存储和查找表上。
该行为也适合数据库名和表的别名。该值为Windows的默认值。

为2时;
表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写字母进行保存,但MySQL将它们
转换为小写在查找表上。名称比较对大小写不敏感,即按照大小写来保存,按照小写来比较。注释:只在对大小
写不敏感的文件系统上使用! innodb表名用小写保存。

如果你使用innodb表,为了避免避免大小写敏感问题,可以把lower_case_table_names=1

2.和字段名字有关
字段名是不区分大小写的

3.和字段值有关
字段值的大小写由Mysql的collate来控制。提到collate,就不得不说字符集。字符集是一套符号和编码,collate
是在字符集内用于比较字符的一套规则,比如定义'A'<'B'这样的关系的规则。不同的字符集有多种校对规则,一般
而言,collate以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)
或_bin(二元)结束 。

比如 utf8字符集:
utf8_general_ci,表示不区分大小写,这个是utf8字符集默认的collate;
utf8_general_cs表示区分大小写,
utf8_bin表示二进制比较,同样也区分大小写。

查看数据库的字符集相关信息
mysql> show variables like '%character%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | utf8                             |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | utf8                             |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.00 sec)

查看数据库collation相关信息
mysql> show variables like '%collation%';
+----------------------+-----------------+
| Variable_name        | Value           |
+----------------------+-----------------+
| collation_connection | utf8_general_ci |
| collation_database   | utf8_general_ci |
| collation_server     | utf8_general_ci |
+----------------------+-----------------+
3 rows in set (0.01 sec)

test是默认创建的数据库
mysql> show create database test;
+----------+---------------------------------------------------------------+
| Database | Create Database                                               |
+----------+---------------------------------------------------------------+
| test     | CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+---------------------------------------------------------------+
1 row in set (0.00 sec)

testx是指定字符集和collation的数据库
mysql> create database testx default character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)

mysql> show create database testx;
+----------+---------------------------------------------------------------------------------+
| Database | Create Database                                                                 |
+----------+---------------------------------------------------------------------------------+
| testx    | CREATE DATABASE `testx` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_bin */ |
+----------+---------------------------------------------------------------------------------+
1 row in set (0.00 sec)

case2是默认创建的表
mysql> show create table case2;
+-------+------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                           |
+-------+------------------------------------------------------------------------------------------------------------------------+
| case2 | CREATE TABLE `case2` (
  `a` int(11) DEFAULT NULL,
  `B` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

case4是指定字符集和collate的表
mysql> create table case4(a int(11),B varchar(10)) default character set utf8 collate utf8_bin;;
Query OK, 0 rows affected (0.12 sec)

mysql> show create table case4;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                             |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
| case4 | CREATE TABLE `case4` (
  `a` int(11) DEFAULT NULL,
  `B` varchar(10) COLLATE utf8_bin DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

我们可以在创建数据库或表时指定是否大小写敏感,如果没有指定的话,通过语句级的collate和binary也可以实现

mysql> select * from case1;
+------+------+
| a    | B    |
+------+------+
|    1 | AAA  |
|    2 | bbb  |
|    4 | AAA  |
|    3 | BBB  |
+------+------+
4 rows in set (0.00 sec)

mysql> select * from case1 where B like '%b%';
+------+------+
| a    | B    |
+------+------+
|    2 | bbb  |
|    3 | BBB  |
+------+------+
2 rows in set (0.00 sec)

指定Collation
mysql> select * from case1 where B like '%b%' collate utf8_bin;
+------+------+
| a    | B    |
+------+------+
|    2 | bbb  |
+------+------+
1 row in set (0.01 sec)

通过binary把字符串转化为二进制比较,由于大小写字符的二进制肯定不同,因此也是区分大小的一种方式
mysql> select * from case1 where binary B like '%b%';
+------+------+
| a    | B    |
+------+------+
|    2 | bbb  |
+------+------+
1 row in set (0.00 sec)

mysql>

最后要说明一点的是Collation与索引存储的关系。因为Collation是用于字符串之间比较,而索引是基于比较有序排列的,
因此Collation会影响记录的索引顺序

把lower_case_table_names从0改变为1
在你把lower_case_table_names设置为1时,在restart你的mysqld之前,请把数据库名和表名更改为小写
 mysql> RENAME TABLE T1 TO t1;

以上文章转自

Mysql大小写敏感 - 冰刀(skate) - 博客频道 - CSDN.NET
http://blog.csdn.net/wyzxg/article/details/44236259

===========================================================================================================

Mysql中字段大小写敏感问题 - 猪先森 - 博客频道 - CSDN.NET
http://blog.csdn.net/Del_Zhu/article/details/49998935

MySQL中大小写敏感问题经常会带来很多问题: 
比如说: 
select * from test 和 SELECT * FROM TEST 是无差别的。这个还好理解,但是如果遇到下面这样的情况:

select * from test where name = 'del' 和 select * from test where name='DEL' 无差别

那就很可怕了!!

解决方法

这是什么原因呢?原来是因为MySQL中字符编码导致的。简单的说:

utf-8_bin 
以二进制值进行比较,也就是区分大小写 
uft-8_general_ci 
一般比较,不区分大小写 ‘A’=’a’collation:校对 
摘自: mysql中的collation什么意思 其中的utf8-bin

所以才会发生上面那种这么奇怪的问题!

另外,网上也有说添加binary关键字进行字段修饰的解决方法:

alter table test modify name binary;

其实本质上也是把collatioin(校对)模式改成二进制校对,实现大小写敏感。

相关阅读:http://dev.mysql.com/doc/search/?q=collation

MySQL数据记录大小写敏感问题【转】的更多相关文章

  1. MYSQL的binary解决mysql数据大小写敏感问题 《转载》

    BINARY不是函数,是类型转换运算符,它用来强制它后面的字符串为一个二进制字符串,可以理解为在字符串比较的时候区分大小写如下:mysql> select binary 'ABCD'='abcd ...

  2. MySQL单表百万数据记录分页性能优化

    背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行. 测试环境: 先让我们熟悉下基本的sql语句,来查看下我 ...

  3. 随机获取Mysql数据表的一条或多条记录

    随机获得Mysql数据表的一条或多条记录有很多方法,下面我就以users(userId,userName,password......)表(有一百多万条记录)为例,对比讲解下几个方法效率问题: sel ...

  4. MySQL 单表百万数据记录分页性能优化

    文章转载自:http://www.cnblogs.com/lyroge/p/3837886.html 背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台 ...

  5. MySQL查询数据表中数据记录(包括多表查询)

    MySQL查询数据表中数据记录(包括多表查询) 在MySQL中创建数据库的目的是为了使用其中的数据. 使用select查询语句可以从数据库中把数据查询出来. select语句的语法格式如下: sele ...

  6. MySQL单表百万数据记录分页性能优化,转载

    背景: 自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行. 测试环境: 先让我们熟悉下基本的sql语句,来查看下我 ...

  7. MYSQL数据库学习十一 多表数据记录查询

    11.1 关系数据操作 并(UNION):把具有相同字段数目和字段类型的表合并到一起. 笛卡尔积(CARTESIAN PRODUCT):没有连接条件表关系的返回结果.字段数=table1字段数+tab ...

  8. MYSQL数据库学习十 单表数据记录查询

    10.1 简单数据记录查询 SELECT field1,field2,...fieldn FROM table_name; “*” ——查询所有记录 SELECT * FROM table_name; ...

  9. mysql数据库通过二进制 -【恢复数据记录】

    1.修改配置文件 vi /etc/my.cnf log-bin = binlog systemctl restart mysqld mysql -uroot -p123456 mysql> sh ...

随机推荐

  1. CF915E Physical Education Lessons

    题意: Alex高中毕业了,他现在是大学新生.虽然他学习编程,但他还是要上体育课,这对他来说完全是一个意外.快要期末了,但是不幸的Alex的体育学分还是零蛋! Alex可不希望被开除,他想知道到期末还 ...

  2. 【刷题】BZOJ 1061 [Noi2008]志愿者招募

    Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完 ...

  3. 【2018ICPC青岛】

    B 题意:给n个问题,每个问题有一个固定的答案ai(<=10^5).现在有m个约束关系,每个约束关系是一个二元组(ui,vi),表示你回答ui.vi问题的答案必须一样. 现在让你输出分别修复一个 ...

  4. Backbone学习总结

    Backbone中文学习文档:http://www.css88.com/doc/backbone/ 来到公司已经有一段时间了,到现在深深的感觉到自己的能力弱的像只周黑鸭,又干涩又黝黑,充满了麻(手麻脑 ...

  5. BP神经网络人口预测程序(matlab实现)

    自己测试人口预测的matlab实现: x=[54167    55196    56300    57482    58796    60266    61465    62828    64653  ...

  6. mysql查改

    1 MySQL UNION 操作符语法格式: SELECT expression1, expression2, ... expression_n FROM tables [WHERE conditio ...

  7. mysql快速导入5000万条数据过程记录(LOAD DATA INFILE方式)

    mysql快速导入5000万条数据过程记录(LOAD DATA INFILE方式) 首先将要导入的数据文件top5000W.txt放入到数据库数据目录/var/local/mysql/data/${d ...

  8. numpy/arrayobject.h”: No such file or directory

    import numpyimport pyximportpyximport.install(setup_args={"script_args":["--compiler= ...

  9. HTML常用标签-<head>内常用标签

    HTML常用标签-<head>内常用标签 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML是什么     1>.超文本标记语言(Hypertext Ma ...

  10. oracle中所有存在不存在的用户都可以使用dba连接到数据库

    oracle中所有存在不存在的用户都可以使用dba连接到数据库及解决方式 以前一直使用conn /as sysdba连接数据库,不明白里面的意思.今天无意中使用其他的用户名密码连接到dba竟然也可以( ...