lower_case_table_names和数据库在Linux和windows平台之间的相互迁移问题
MySQL关于 lower_case_table_names 的文档 https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html
In MySQL, databases correspond to directories within the data directory. Each table within a database corresponds to at least one file within the database directory (and possibly more, depending on the storage engine). Triggers also correspond to files. Consequently, the case sensitivity of the underlying operating system plays a part in the case sensitivity of database, table, and trigger names. This means such names are not case-sensitive in Windows, but are case-sensitive in most varieties of Unix. One notable exception is macOS, which is Unix-based but uses a default file system type (HFS+) that is not case-sensitive. However, macOS also supports UFS volumes, which are case-sensitive just as on any Unix. See Section 1.8.1, “MySQL Extensions to Standard SQL”. The lower_case_table_names system variable also affects how the server handles identifier case sensitivity, as described later in this section.
1. 原理部分:
MySQL的数据库名称、表名称、触发器名称 是对应到 目录和文件名称。而在 Linux系统下面,目录和文件名称是区分大小写的,所以默认 数据库名称、表名、触发器名称也是区分大小写的。
但是Windows系统下面目录 和文件名 是不区分大小写的:


上图当我们在windows下面建立一个a和A的文件夹时,弹出提示;当我们建立a.txt和A.txt时也弹出提示。
2. 默认值的影响
How table and database names are stored on disk and used in MySQL is affected by the lower_case_table_names system variable, which you can set when startingmysqld. lower_case_table_names can take the values shown in the following table. This variable does not affect case sensitivity of trigger identifiers. On Unix, the default value of lower_case_table_names is 0. On Windows, the default value is 1. On macOS, the default value is 2.
Linux下面 lower_case_table_names 默认是0,Windows下默认是1,MacOS默认是2;
他们的含义如下:
lower_case_table_names=0 库名表名存储为给定的大小和比较是区分大小写的
lower_case_table_names = 1 库名表名存储在磁盘是小写的,但是比较的时候是不区分大小写
lower_case_table_names=2 库名表名存储为给定的大小写但是比较的时候是小写的
3. 存在的问题1:
如果从Windows平台迁移到Linux平台,原来的库名和表名是不区分大小写的;比如一个user表,他是小写存储,但是sql语句里面使用:
select * from user 和 select * from USER 或者 select * from User都是一样的,因为在查找比较是是不区分大小的;
先要迁移到Linux平台,导入之后 库名表名也是小写存储,但是库名表名在比较查找时是区分大小写的,所以:
只有 select * from user是可以找到user表对应的存储在Linux下的文件的,其他任何形式都是无法找到表的;
解决方法:迁移到Linux平台之后,将 lower_case_table_names 的值改成1;也就是在查找比较时不区分大小写就可以了;
存在的风险:比如Linux平台原来有 tuser 表和 TUSER表,因为原来是区分大小写的,他们对应的是不同的表和存储文件,现在改成不区分大小写,那么问题就出现了!表名冲突了。不过这种情况比较少见。相对而言还是比较安全的。
4. 存在的问题2:
如果是从Linux平台迁移到Windows平台,原来的库名和表名是区分大小写的;现在迁移到Windows平台,不区分大小写,
比如原来有 tuser 表和 TUSER表,因为原来是区分大小写的,他们对应的是不同的表和存储文件,现在改成不区分大小写,那么问题就出现了!!!表名冲突了!不过这种情况比较少见。
解决方法:迁移到Windows平台之后,将 lower_case_table_names 的值改成0;也就是在查找比较时区分大小写就可以了;
存在的风险:存储和比较都是区分大小写了,比如原来windows平台的 select * from user 和 select * from USER都是合法的,现在导致 select * from USER会找不到表名了!!!
所以从 linux平台迁移到 windows平台是,一般是不需要修改 将 lower_case_table_names 的值改成0的,因为表名冲突的情况及其罕见。从区分大小写到不区分大小写在一般情况下面是兼容的。
而且如果windows平台的数据库存在之前的数据库,修改之后,导致应用系统的sql找不到表名,这个问题更加严重!
5. 建议
Use
lower_case_table_names=1on all systems. The main disadvantage with this is that when you useSHOW TABLESorSHOW DATABASES, you do not see the names in their original lettercase.Use
lower_case_table_names=0on Unix andlower_case_table_names=2on Windows. This preserves the lettercase of database and table names. The disadvantage of this is that you must ensure that your statements always refer to your database and table names with the correct lettercase on Windows. If you transfer your statements to Unix, where lettercase is significant, they do not work if the lettercase is incorrect.Exception: If you are using
InnoDBtables and you are trying to avoid these data transfer problems, you should setlower_case_table_namesto 1 on all platforms to force names to be converted to lowercase.
如果不存在在不同平台迁移的情况,那么保持默认值即可。
如果存在Linux和Windows平台之间进行迁移的情况,那么在一开始的时候任何平台设置lower_case_table_names=1可以避免问题;
设置lower_case_table_names=1唯一的问题是, show tables 和 show databases 看到的不是你新建表和数据库时指定的大小写字母。
6. 总结
0. 其实掌握原理:MySQL的库名和表名对应到文件目录和文件,然后Linux区分目录和文件名称大小写,而Windows平台不区分,其他的东西都可以推演处理;
1. 在windows和linux平台之间迁移时,需要修改 lower_case_table_names = 1;而Linux向Windows平台迁移时,一般不需要修改改参数;
2. 在任何平台一开始的时候就设置 lower_case_table_names=1 可以解决平台迁移时存在的问题;
3. 触发器名称的比较不是由lower_case_table_names来控制的;
lower_case_table_names和数据库在Linux和windows平台之间的相互迁移问题的更多相关文章
- 在Linux和Windows平台上操作MemoryMappedFile(简称MMF)
操作系统很早就开始使用内存映射文件(Memory Mapped File)来作为进程间的共享存储区,这是一种非常高效的进程通讯手段..NET 4.0新增加了一个System.IO. MemoryMap ...
- 国密SM3算法在linux和windows平台结果不一致问题
什么是sm3,是一种类似于sha256的哈希算法,是咱们国家的哈希标准算法: 最近在使用sm3算法时,同样的一份数据,调用同样的sm3接口,发现得到的结果是不一样的: 那么在应用过的过程中,如果同样的 ...
- Linux和windows 平台下启动和关闭mysql服务
Linux平台下启动和关闭mysql服务 一.linux下查看mysql服务的两种方式: 方式一: [root@localhost bin]ps -ef|grep mysql 方式二: [root@l ...
- 使用Samba服务实现Linux与Windows系统之间的文件共享
使用Samba服务口令验证方式可以让共享文件更加的安全,做到仅让信任的用户访问,而且验证过程也很简单,要想使用口令验证模式,我们需要先需要创建Samba服务独立的数据库. 第一步:安装Samba服务软 ...
- 如丝般顺滑地从Windows迁移SQLServer数据库到Linux
老鸟看过菜鸟的上一篇<MSSQL On Linux备份与还原>文章后,很满意,但是还是忍不住发问:"这篇文章讲的是MSSQL在Linux系统上的备份与还原,如果我之前是Windo ...
- linux和windows通用的路径
String path=request.getSession().getServletContext().getRealPath("/")+"js" + Sys ...
- Windows平台下源码分析工具
最近这段时间在阅读 RTKLIB的源代码,目前是将 pntpos.c文件的部分看完了,准备写一份文档记录下这些代码的用处.处理过程.理论公式来源.注意事项,自己还没有弄明白的地方.目前的想法是把每一个 ...
- Linux和Windows系统的远程桌面访问知识(转载)
为新手讲解Linux和Windows系统的远程桌面访问知识 很多新手都是使用Linux和Windows双系统的,它们之间的远程桌面访问是如何连接的,我们就为新手讲解Linux和Windows系统的 ...
- 在linux和windows下自动备份数据库
摘要: 详细介绍在windows和linux下自动备份数据库的过程,希望可以让新手立即上手吧! 本文档内容共分为2大部分:linux和windows Linux和windows都分为:准备工作和操作阶 ...
随机推荐
- 微信小程序 - 事件 | 传递 | 冒泡
事件 常见的事件有: 类型 触发条件 最低版本 touchstart 手指触摸动作开始 touchmove 手指触摸后移动 touchcancel 手指触摸动作被打断,如来电提醒,弹窗 t ...
- 史上最全NOIP初赛知识点
CSP-J/S 第一轮知识点选讲 \(NOIP\)(全国青少年信息学奥林匹克竞赛)于2019年取消.取而代之的是由\(CCF\)推出的非专业级软件能力认证,也就是现在的\(CSP-J/S\).作为一名 ...
- 【Step-By-Step】第 三 周
本周面试题一览: 什么是XSS攻击,XSS 攻击可以分为哪几类?我们如何防范XSS攻击? 如何隐藏页面中的某个元素? 浏览器事件代理机制的原理是什么? setTimeout 倒计时为什么会出现误差? ...
- Linux性能优化实战学习笔记:第四十一讲
一.上节回顾 上一节,我们探究了网络延迟增大问题的分析方法,并通过一个案例,掌握了如何用hping3.tcpdump.Wireshark.strace 等工具,来排查和定位问题的根源. 简单回顾一下, ...
- 原生/CM系列网络叹号问题
网络叹号问题: 原因:某墙屏蔽了谷歌,而原生安卓是利用谷歌的服务器来测试网络是否通畅的 解决方案:修改网络测试的服务器地址 方案来源:https://www.noisyfox.io/android-c ...
- C++版本 ORM 访问数据库之ODB 的Window环境编译(一)
先简单说说我为什么要编译一个ORM访问数据库的版本, 以前在做C#访问数据库时候, 直接以orm方式访问数据库, 代码写起来简单, 不用写各种复杂的sql语句, 直接有orm框架生成, 后来转到C+ ...
- [转载]3.11 UiPath存在文本Text Exists的介绍和使用
一.Text Exists的介绍 检查是否在给定的UI元素中找到了文本,输出的是一个布尔值 二.Text Exists在UiPath中的使用 1.打开设计器,在设计库中新建一个Sequence,为序列 ...
- 查看window重启日志
命令行输入 net statistics WORKSTATION 显示开机时间 如果你今天一直没有关机,但是你看到这个信息显示今天XX点才开始统计数据的说明电脑重启了
- linux内核debug的一种方式:procfs
#include <linux/module.h> #include <linux/compat.h> #include <linux/types.h> #incl ...
- CentOS 安装libgdi的方法
1. 安装必须的包 yum install glib2-devel cairo-devel libjpeg-turbo-devel-1.2.90-8.el7.x86_64 libtiff-devel- ...