不同系统的MySQL的大小写敏感性
1. 操作系统的影响
-
Unix/Linux:
- 默认情况下,数据库名、表名等是区分大小写的。
- 文件系统的大小写敏感性会影响MySQL的行为。例如,如果你使用的是ext4文件系统(通常是大小写敏感的),那么
myTable
和MyTable
会被视为两个不同的表。
-
Windows:
- 默认情况下,Windows上的MySQL不区分数据库名和表名的大小写。这意味着
myTable
和MyTable
被视为同一个表。 - 这种行为可以通过修改MySQL配置来改变,但通常不推荐这样做,因为这可能会导致跨平台兼容性问题。
- 默认情况下,Windows上的MySQL不区分数据库名和表名的大小写。这意味着
-
Mac OS X:
- Mac OS X的行为类似于Unix/Linux,默认情况下是区分大小写的。
- 但是,某些版本的Mac OS X可能默认使用大小写不敏感的文件系统(如HFS+),这会影响MySQL的行为。
2. lower_case_table_names
配置
lower_case_table_names
是一个MySQL系统变量,用于控制表名的存储和比较方式。这个变量有三个值:
-
0 (默认值, Unix/Linux):
- 表名按照给定的大小写保存,并且对大小写敏感。
- 例如:
CREATE TABLE myTable (id INT);
和CREATE TABLE MyTable (id INT);
会被视为两个不同的表。
-
1 (默认值, Windows):
- 表名被转换为小写并以小写形式保存。
- 查询时也必须使用小写。例如:
CREATE TABLE myTable (id INT);
会被存储为mytable
,查询时需要使用SELECT * FROM mytable;
。
-
2:
- 表名按照给定的大小写保存,但在比较时转换为小写。
- 这有助于保持与旧版本MySQL的兼容性。例如:
CREATE TABLE myTable (id INT);
会被存储为myTable
,但在查询时SELECT * FROM MyTable;
也是有效的。
修改 lower_case_table_names
的方法
-
通过配置文件修改:
- 打开MySQL配置文件(通常是
my.cnf
或my.ini
)。 - 在
[mysqld]
部分添加或修改lower_case_table_names
参数。 - 例如:
[mysqld] lower_case_table_names=1
- 保存文件并重启MySQL服务。
- 打开MySQL配置文件(通常是
-
通过命令行修改:
- 可以临时设置该参数,但不会持久化到配置文件中。
- 例如:
SET GLOBAL lower_case_table_names = 1;
3. SQL语句关键字
SQL语句中的关键字(如SELECT
, FROM
, WHERE
等)是不区分大小写的。无论你用大写还是小写书写这些关键字,MySQL都能正确解析它们。例如:
SELECT * FROM myTable;
select * from myTable;
都是有效的。
4. 标识符(Identifier)
标识符包括表名、列名、索引名等。默认情况下,这些名称是不区分大小写的,除非你特别指定了它们应该区分大小写。你可以通过以下几种方式指定:
-
使用反引号(
`
)包围标识符:CREATE TABLE `myTable` ( `Name` VARCHAR(50) );
这样即使在大小写敏感的环境中,
myTable
和Name
也会被正确识别。 -
使用双引号(
" "
)包围标识符(如果服务器启用了ANSI_QUOTES
SQL模式):SET sql_mode = 'ANSI_QUOTES'; CREATE TABLE "myTable" ( "Name" VARCHAR(50) );
5. 字符串比较
字符串比较是否区分大小写取决于所使用的字符集和排序规则。例如:
-
utf8_general_ci
排序规则:不区分大小写。SELECT * FROM users WHERE name = 'John';
会匹配
name
列中的john
,JOHN
,John
等。 -
utf8_bin
或utf8_general_cs
排序规则:区分大小写。SELECT * FROM users WHERE name = 'John' COLLATE utf8_bin;
只会匹配
name
列中的John
。
6. 具体示例
假设我们有一个表Users
,其中有一列Name
,我们可以看到不同情况下的表现:
-
在Linux上创建表:
CREATE TABLE Users (Name VARCHAR(50));
如果你在查询时使用了
users
或USERS
,可能会失败,因为Linux区分大小写。 -
在Windows上创建表:
CREATE TABLE Users (Name VARCHAR(50));
无论你使用
users
还是USERS
进行查询,都不会有问题,因为Windows默认不区分大小写。 -
确保跨平台一致性: 使用反引号可以确保在所有平台上都一致:
CREATE TABLE `Users` (`Name` VARCHAR(50));
这样即使在Linux上也能正常工作。
7. 总结
- 操作系统:Unix/Linux默认区分大小写,Windows默认不区分大小写。
lower_case_table_names
:控制表名的存储和比较方式,可以通过配置文件或命令行设置。- SQL关键字:不区分大小写。
- 标识符:默认不区分大小写,可以通过反引号或双引号指定。
- 字符串比较:取决于排序规则,
ci
表示不区分大小写,cs
或bin
表示区分大小写。