不同系统的MySQL的大小写敏感性

1. 操作系统的影响

  • Unix/Linux:

    • 默认情况下,数据库名、表名等是区分大小写的。
    • 文件系统的大小写敏感性会影响MySQL的行为。例如,如果你使用的是ext4文件系统(通常是大小写敏感的),那么myTableMyTable会被视为两个不同的表。
  • Windows:

    • 默认情况下,Windows上的MySQL不区分数据库名和表名的大小写。这意味着myTableMyTable被视为同一个表。
    • 这种行为可以通过修改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 的方法
  1. 通过配置文件修改

    • 打开MySQL配置文件(通常是my.cnfmy.ini)。

    • [mysqld] 部分添加或修改 lower_case_table_names 参数。

    • 例如:

      sql 复制代码
      [mysqld]
      lower_case_table_names=1
    • 保存文件并重启MySQL服务。

  2. 通过命令行修改

    • 可以临时设置该参数,但不会持久化到配置文件中。

    • 例如:

      sql 复制代码
      SET GLOBAL lower_case_table_names = 1;

3. SQL语句关键字

SQL语句中的关键字(如SELECT, FROM, WHERE等)是不区分大小写的。无论你用大写还是小写书写这些关键字,MySQL都能正确解析它们。例如:

sql 复制代码
SELECT * FROM myTable;
sql 复制代码
select * from myTable;

都是有效的。

4. 标识符(Identifier)

标识符包括表名、列名、索引名等。默认情况下,这些名称是不区分大小写的,除非你特别指定了它们应该区分大小写。你可以通过以下几种方式指定:

  • 使用反引号(`````)包围标识符

    sql 复制代码
    CREATE TABLE `myTable` (
        `Name` VARCHAR(50)
    );

    这样即使在大小写敏感的环境中,myTableName也会被正确识别。

  • 使用双引号(" ")包围标识符(如果服务器启用了ANSI_QUOTES SQL模式)

    sql 复制代码
    SET sql_mode = 'ANSI_QUOTES';
    CREATE TABLE "myTable" (
        "Name" VARCHAR(50)
    );

5. 字符串比较

字符串比较是否区分大小写取决于所使用的字符集和排序规则。例如:

  • utf8_general_ci 排序规则:不区分大小写。

    sql 复制代码
    SELECT * FROM users WHERE name = 'John';

    会匹配 name 列中的 john, JOHN, John 等。

  • utf8_binutf8_general_cs 排序规则:区分大小写。

    sql 复制代码
    SELECT * FROM users WHERE name = 'John' COLLATE utf8_bin;

    只会匹配 name 列中的 John

6. 具体示例

假设我们有一个表Users,其中有一列Name,我们可以看到不同情况下的表现:

  • 在Linux上创建表

    sql 复制代码
    CREATE TABLE Users (Name VARCHAR(50));

    如果你在查询时使用了usersUSERS,可能会失败,因为Linux区分大小写。

  • 在Windows上创建表

    sql 复制代码
    CREATE TABLE Users (Name VARCHAR(50));

    无论你使用users还是USERS进行查询,都不会有问题,因为Windows默认不区分大小写。

  • 确保跨平台一致性: 使用反引号可以确保在所有平台上都一致:

    sql 复制代码
    CREATE TABLE `Users` (`Name` VARCHAR(50));

    这样即使在Linux上也能正常工作。

7. 总结

  • 操作系统:Unix/Linux默认区分大小写,Windows默认不区分大小写。
  • lower_case_table_names:控制表名的存储和比较方式,可以通过配置文件或命令行设置。
  • SQL关键字:不区分大小写。
  • 标识符:默认不区分大小写,可以通过反引号或双引号指定。
  • 字符串比较 :取决于排序规则,ci表示不区分大小写,csbin表示区分大小写。
相关推荐
sdaxue.com1 小时前
帝国CMS:如何去掉帝国CMS登录界面的认证码登录
数据库·github·网站·帝国cms·认证码
o(╥﹏╥)2 小时前
linux(ubuntu )卡死怎么强制重启
linux·数据库·ubuntu·系统安全
阿里嘎多学长2 小时前
docker怎么部署高斯数据库
运维·数据库·docker·容器
Yuan_o_2 小时前
Linux 基本使用和程序部署
java·linux·运维·服务器·数据库·后端
Sunyanhui12 小时前
牛客网 SQL36查找后排序
数据库·sql·mysql
老王笔记2 小时前
MHA binlog server
数据库·mysql
lovelin+v175030409663 小时前
安全性升级:API接口在零信任架构下的安全防护策略
大数据·数据库·人工智能·爬虫·数据分析
DT辰白4 小时前
基于Redis的网关鉴权方案与性能优化
数据库·redis·缓存
2401_871213304 小时前
mysql高阶语句
数据库·mysql