不同系统的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表示区分大小写。
相关推荐
月光水岸New38 分钟前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山67539 分钟前
数据库基础1
数据库
我爱松子鱼42 分钟前
mysql之规则优化器RBO
数据库·mysql
chengooooooo1 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser2 小时前
【SQL】多表查询案例
数据库·sql
Galeoto2 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)3 小时前
MySQL主从架构
服务器·数据库·mysql
leegong231113 小时前
学习PostgreSQL专家认证
数据库·学习·postgresql
喝醉酒的小白3 小时前
PostgreSQL:更新字段慢
数据库·postgresql
敲敲敲-敲代码3 小时前
【SQL实验】触发器
数据库·笔记·sql