不同系统的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表示区分大小写。
相关推荐
老衲提灯找美女3 小时前
MySQL数据库基础操作:
数据库·mysql·oracle
轻舟客丶3 小时前
ORA-03113的解决方案
数据库·经验分享·笔记·oracle
ヾChen3 小时前
头歌MySQL——复杂查询
数据库·物联网·学习·mysql·头歌
上下翻飞的屁4 小时前
jdbcTemplate执行sql后数据库字段没有更新问题解决
java·数据库·sql
悦光阴4 小时前
SQL Server 并发控制:Fabric Warehouse只支持快照隔离
大数据·运维·数据库·fabric
谅望者4 小时前
SQL子查询完全指南:从零掌握嵌套查询的三种用法与最佳实践
数据库·sql·数据库开发·子查询
阿萨德528号4 小时前
Redis 分布式锁进阶:跨语言场景下的锁兼容性与一致性保障
数据库·redis·分布式
开开心心就好4 小时前
电脑音质提升:杜比全景声安装详细教程
java·开发语言·前端·数据库·电脑·ruby·1024程序员节
让学习成为一种生活方式4 小时前
调控大肠杆菌胞内ATP和NADH水平促进琥珀酸生产--文献精读172
数据库
yoi啃码磕了牙4 小时前
Unity—Localization 多语言
java·数据库·mysql