【转】MYSQL大小写问题

经常遇到的问题,一些不是特别重要但是又比较郁闷的事情。例如今天这个MySQL大小写敏感。

先上测试结果。

Linux环境下,不是windows平台下。区别很大。注意。

一图胜千言

mysql> show create table Ac;

+-------+-------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                            |

+-------+-------------------------------------------------------------------------------------------------------------------------+

| Ac    | CREATE TABLE `Ac` (

`a` varchar(20) DEFAULT NULL,

`c` varchar(20) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------+-------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

mysql>

mysql> insert into Ac  values (‘1q‘,‘1q‘);

Query OK, 1 row affected (0.00 sec)

mysql> insert into Ac  values (‘1Q‘,‘1Q‘);

Query OK, 1 row affected (0.00 sec)

mysql> select * from Ac WHERE a=‘1q‘;

+------+------+

| a    | c    |

+------+------+

| 1q   | 1q   |

| 1Q   | 1Q   |

+------+------+

2 rows in set (0.00 sec)

mysql> select * from AC ;

ERROR 1146 (42S02): Table ‘test.AC‘ doesn‘t exist

mysql> select * from Ac  where A=‘1Q‘;

+------+------+

| a    | c    |

+------+------+

| 1q   | 1q   |

| 1Q   | 1Q   |

+------+------+

2 rows in set (0.00 sec)

如上的结果能反应说明以下结论。

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:

  1、数据库名与表名是严格区分大小写的;

  2、表的别名是严格区分大小写的;

  3、列名与列的别名在所有的情况下均是忽略大小写的;

4、字段内容默认情况下是大小写不敏感的。

mysql中控制数据库名和表名的大小写敏感由参数lower_case_table_names控制,为0时表示区分大小写,为1时,表示将名字转化为小写后存储,不区分大小写。

mysql> show variables like ‘%case%‘;

+------------------------+-------+

| Variable_name          | Value |

+------------------------+-------+

| lower_case_file_system | OFF   |

| lower_case_table_names | 0     |

+------------------------+-------+

2 rows in set (0.00 sec)

修改cnf配置文件或者编译的时候,需要重启服务。

MySQL存储的字段是不区分大小写的。这个有点不可思议。尤其是在用户注册的业务时候,会出现笑话。所以还是严格限制大小写敏感比如好。

如何避免字段内容区分大小写。就是要新增字段的校验规则。

可以看出默认情况下字段内容是不区分大小写的。大小写不敏感。

mysql> create table aa (a varchar(20) BINARY  , c varchar(20)) ;

Query OK, 0 rows affected (0.10 sec)

mysql> show create table aa;

+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+

| Table | Create Table                                                                                                                                                |

+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+

| aa    | CREATE TABLE `aa` (

`a` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,

`c` varchar(20) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

mysql> select * from aa;

+------+------+

| a    | c    |

+------+------+

| a    | C    |

| a    | C    |

| A    | c    |

+------+------+

3 rows in set (0.00 sec)

mysql> select * from aa where a = ‘a‘;

+------+------+

| a    | c    |

+------+------+

| a    | C    |

| a    | C    |

+------+------+

2 rows in set (0.00 sec)

mysql> select * from aa where a = ‘A‘;

+------+------+

| a    | c    |

+------+------+

| A    | c    |

+------+------+

1 row in set (0.00 sec)

原因如下:

字段值的大小写由mysql的校对规则来控制。提到校对规则,就不得不说字符集。字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则  .

一般而言,校对规则以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)、_cs(大小写敏感)或_bin(二元)结束 。比如 utf8字符集,utf8_general_ci,表示不区分大小写,这个是utf8字符集默认的校对规则;utf8_general_cs表示区分大小写,utf8_bin表示二进制比较,同样也区分大小写 。

作者原文地址:

http://www.cnblogs.com/wzmenjoy/p/4244545.html

时间: 2024-10-25 23:38:31

【转】MYSQL大小写问题的相关文章

mysql 大小写问题-sql-mode问题

一.mysql 字段名 表名 数据库名 是否区分大小写 今天碰到数据库大小写问题,linux与windows下问题 同时又碰到保留字 http://www.cnblogs.com/lawdong/archive/2010/08/08/2357903.html(别人收集的.大家可以看一下保留字有哪些) 以下为本人测试所得结论: Linux操作系统下 数据库 默认是区分大小写 表名 默认是区分大小写 字段名 默认是 不 区分大小写 Windows操作系统下 数据库不区分大小写 表名不区分大小写 字段

MySQL大小写问题

字段值的大小写由mysql的校对规则来控制.提到校对规则,就不得不说字符集.字符集是一套符号和编码,校对规则是在字符集内用于比较字符的一套规则  . 一般而言,校对规则以其相关的字符集名开始,通常包括一个语言名,并且以_ci(大小写不敏感)._cs(大小写敏感)或_bin(二元)结束 .比如 utf8字符集,utf8_general_ci,表示不区分大小写,这个是utf8字符集默认的校对规则:utf8_general_cs表示区分大小写,utf8_bin表示二进制比较,同样也区分大小写 .

MySQL大小写补坑记

背景:由于项目开始时数据库设计经验不足,数据库名和部分数据表名都含有大写字母.但问题是,Linux上数据库名和表名是区分大小写的,而Windows上是不区分大小写的.结果就是在看本地的数据库的时候,对着写的代码是小写的表名,后来传到服务器上却发现报错,几经审查才发觉是表名的大小写不统一的问题.真是天坑啊,坑了自己也坑了小伙伴.怎么办呢?代码已经比较多了,不太可能一下子就把代码里面的表名都改过来.网上看到说设置 lower_case_table_names 可以使Linux上的数据库表名不区分大小

MYSQL大小写(由于数据由windows迁移到Linux导致)

今日从sqlserver上迁移了一个数据库到Linux的MySQL中,迁移成功了,但是应用却跑不通,查看日志发现,提示找不到表,我注意到,表名都是存在大小写的,而MySQL中的表名都是小写的.这提醒了我,莫非MySQL 中表名是大小写敏感的?一查果然如此.解决方案如下: 1.用ROOT登录,修改/etc/my.cnf 2.在[mysqld]下加入一行:lower_case_table_names=1 3.重新启动数据库即可 其中 lower_case_table_names=1 参数缺省地在 W

MySQL大小写问题的简单说明(关键字/函数/表名)(转)

MySQL语句中字母大小写规则随着语句元素的不同而变化,同时还要取决于MySQL服务器主机上的操作系统. SQL关键字与函数名 关键字和函数名不区分字母的大小写.如.abs.bin.now.version.floor等函数.SELECT.WHERE.ORDER.GROUP BY等关键字. 数据库.数据表和视图的名字 在服务器主机上,MySQL数据库和数据表用底层文件系统中的目录和文件表示.因此数据库和数据表名字的默认字母大小写情况取决于服务器主机上的操作系统在文件名方面的规定.Windows文件

Mysql 大小写问题

今天发布程序的时候,日志报错找不到表,但是系统中已经存在表,最后发现是sql大小写的问题,mysql默认设置导致这些执行失败. 1.用ROOT登录,修改/etc/my.cnf 2.在[mysqld]下加入一行:lower_case_table_names=1 3.重新启动数据库即可 就需要设置忽略大小写.设置lower-case-table-names=1,重启mysql实例生效. 这时就产生了另外一个问题,之前的大写字母的数据库名都失效了.都提示找不到数据库名.注释掉个lower-case-t

mysql 大小写取消敏感设置

#mysqld --SET-lower_case_table_names=1; 或者在mysql server的配置文件中添加配置项: vi /etc/my.cnf lower_case_table_names=1 该变量值的详细定义如下: Value Meaning 0 Table and database names are stored on disk using the lettercase specified in the CREATE TABLE orCREATE DATABASE 

LINUX下mysql的大小写是否区分设置 转

一.Linux中MySQL大小写详情:1.数据库名严格区分大小写2.表名严格区分大小写的3.表的别名严格区分大小写4.变量名严格区分大小写5.列名在所有的情况下均忽略大小写6.列的别名在所有的情况下均忽略大小写 二.设置MySQL表名不区分大小写1.切换到root用户$ su - root 2.修改/etc/my.cof配置文件,# sed -i '/mysqld/a\lower_case_table_names=1' /etc/my.cnf lower_case_table_names参数详解

linux/centos下设置Mysql表名不区分大小写

情景:公司近期在将数据库从ORACLE转为MYSQL,由于之前在ORACLE中表名是不区分大小写,因此到mysql中就出现了找不到表的问题,经上网查询,发现在linux下mysql的表名是区分大小写的,但是有参数可以使其不区分大小写. 一.linux中mysql大小写详情: 1.数据库名严格区分大小写 2.表名严格区分大小写的 3.表的别名严格区分大小写 4.变量名严格区分大小写 5.列名在所有的情况下均忽略大小写 6.列的别名在所有的情况下均忽略大小写 二.添加参数使其不区分大小写 1.切换到