详解记录MySQL中lower_case_table_names的坑

详解记录MySQL中lower_case_table_names的坑

在 MySQL 中,lower_case_table_names 是一个非常重要的参数。它用于设置大小写敏感的表名是否被转换为小写。

设置

在 MySQL 的配置文件(my.cnf)中,可以通过以下方式对其进行设置:

[mysqld]
lower_case_table_names=1

它有以下三个取值:

  • 0:大小写敏感
  • 1:转换为小写
  • 2:转换为小写,但保留原始的表名大小写

坑点1:切换值后需要重建表

当 lower_case_table_names 的值从 0 或 2 切换到 1 时,必须重建所有表,因为表名的大小写将被转换为小写。同样地,当该值从 1 切换到 0 或 2 时,表名的大小写将变得重要,可能导致查询失败。

以下是该坑点的示例说明:

  • 将 lower_case_table_names 的值从 0 修改为 1,需要重建 test 表:

```sql
-- 原始表名
CREATE TABLE test (id INT PRIMARY KEY, name VARCHAR(20));

-- 修改配置文件中的 lower_case_table_names 值为 1
-- 重启 MySQL

-- 查询 test 表(应该会报错),然后重命名并重新建立该表
RENAME TABLE test TO test_old;
CREATE TABLE test (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO test (id, name) VALUES (1, 'hello');
SELECT * FROM test;
```

  • 将 lower_case_table_names 的值从 1 修改为 0,也需要重建 test 表:

```sql
-- 原始表名(转换为小写)
CREATE TABLE test (id INT PRIMARY KEY, name VARCHAR(20));

-- 修改配置文件中的 lower_case_table_names 值为 0
-- 重启 MySQL

-- 查询 TEST 表(应该会报错),然后重命名并重新建立该表(大小写敏感)
RENAME TABLE test TO test_old;
CREATE TABLE TEST (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO TEST (id, name) VALUES (1, 'hello');
SELECT * FROM TEST;
```

坑点2:大小写不敏感可能导致数据丢失

在 lower_case_table_names 的值为 1 和 2 时,如果存在同名但大小写不同的表,可能会导致数据丢失。

以下是该坑点的示例说明:

  • 以 lower_case_table_names 的值为 1 为例:

```sql
-- 创建 name 表(转换为小写)
CREATE TABLE name (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO name (id, name) VALUES (1, 'name1');

-- 查询 NAME 表
SELECT * FROM NAME;

-- 创建 NAME 表
CREATE TABLE NAME (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO NAME (id, name) VALUES (2, 'name2');

-- 查询 name 表
SELECT * FROM name;
```

这时候会发现,第二个插入的数据 "name2" 并未插入到数据库中,因为最后一个 SELECT 语句查询时使用的表名是小写的。

  • 以 lower_case_table_names 的值为 2 为例:

```sql
-- 创建 name 表(转换为小写)
CREATE TABLE name (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO name (id, name) VALUES (1, 'name1');

-- 查询 NAME 表
SELECT * FROM NAME;

-- 创建 NAME 表(保留原始大小写)
CREATE TABLE NAME (id INT PRIMARY KEY, name VARCHAR(20));
INSERT INTO NAME (id, name) VALUES (2, 'name2');

-- 查询 name 表
SELECT * FROM name;
```

这时候会发现,插入的数据均被保留,因为最后一个 SELECT 语句查询时使用的表名是小写的。

结论

在使用 MySQL 数据库时,需要注意 lower_case_table_names 参数,合理地设置它的值并且谨慎修改。在设计表结构时,也需要避免同名但大小写不同的表的存在。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解记录MySQL中lower_case_table_names的坑 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • Redis 参数详解

    Redis 参数详解:   使用config get * 获得所有的配置项的key #daemonize no 默认情况下, redis 不是在后台运行的,如果需要在后台运行,把该项的值更改为 yes daemonize yes # 当 redis 在后台运行的时候, Redis 默认会把 pid 文件放在 /var/run/redis.pid ,你可以配置…

    Redis 2023年4月16日
    00
  • MySQL获取当前时间的多种方式总结

    当我们在编写MySQL的SQL语句时,有时需要在SQL语句中获取当前时间。MySQL提供了多种方式来获取当前时间,下面我们来总结一下。 使用NOW()函数获取当前时间 MySQL提供了NOW()函数来获取当前时间。NOW()函数可以返回当前的日期和时间值,它的返回值格式为’YYYY-MM-DD HH:MM:SS’。 使用NOW()函数的示例: SELECT …

    database 2023年5月22日
    00
  • golang1.16新特性速览(推荐)

    Golang1.16新特性速览(推荐)攻略 Golang1.16版本推出了许多全新的特性,本文将为你详细介绍各项新特性及其使用方法。 Embeddings 新版本中,可以使用Embeddings机制来将一个结构体嵌套到另一个结构体中,同时在使用过程中可以直接访问这两个结构体的方法和属性。下面是一个简单的示例: type Person struct { Nam…

    database 2023年5月22日
    00
  • windows下重置mysql的root密码方法介绍

    下面是“windows下重置mysql的root密码方法介绍”的完整攻略。 第一步:停止mysql服务 在重置mysql的root密码之前,需要先停止mysql服务。可以通过windows的命令行工具或者mysql自带的停止命令进行停止。 使用windows命令行工具:打开命令行工具,输入以下命令并执行。 bash net stop mysql 使用mysq…

    database 2023年5月21日
    00
  • MySQL游标(Cursor)的定义及使用方法详解

    MySQL游标(Cursor)是一种可在数据库中使用的数据结构,它被用于遍历结果集中的所有行并进行特定操作。游标通常用于存储过程和函数中,当需要一行一行地获取结果集中的数据时,它就变得非常有用了。 游标通常与SELECT语句一起使用,以便在结果集中获取数据。游标用于遍历结果集中的记录,并将结果集中的数据一行一行地存储或处理。游标顺序访问结果集中的每一行,并将…

    MySQL 2023年3月10日
    00
  • Linux安装Redis步骤和make遇到的坑

    Linux安装Redis服务步骤 1.获取redis资源 ​​​​​​​cd /usr/local wget https://mirrors.huaweicloud.com/redis/redis-6.0.10.tar.gz 2.解压 tar xzvf redis-6.0.10.tar.gz 3.安装 cd redis-6.0.10 make cd src …

    Redis 2023年4月13日
    00
  • asp中使用MSXML2.ServerXMLHTTP实现异步请求例子

    使用MSXML2.ServerXMLHTTP可以实现异步请求数据的功能,在ASP中使用该对象可以方便地实现异步请求。下面,我将为您介绍如何使用MSXML2.ServerXMLHTTP实现异步请求的完整攻略,并提供两个示例说明。 步骤一:创建MSXML2.ServerXMLHTTP对象 在ASP中使用MSXML2.ServerXMLHTTP需要先创建该对象。以…

    database 2023年5月21日
    00
  • Java用 Rhino/Nashorn 代替第三方 JSON 转换库

    使用 Rhino/Nashorn 代替第三方 JSON 转换库的攻略如下: 背景 在 Java 开发中,我们经常需要将 Java 对象转成 JSON 格式,或者将 JSON 格式转成 Java 对象。通常情况下,我们会依赖第三方 JSON 转换库,如 fastjson、Jackson、Gson 等。但是,Rhino 和 Nashorn 都提供了 JSON 的…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部