Mysql数据库名和表名的大小写敏感性问题

本文介绍MySQL在不同操作系统下的表名大小写敏感性差异,以及如何通过配置my.ini或my.cnf文件中的lower_case_table_names选项来调整这一行为。
Windows下的MySQL表名大写

 


Windows 版的 MySQL 默认继承 os 的大小写习惯,即使 SQL中有区分,在导入的时候都会被转为小写,如果今后再将此数据库导出就可能存在大小写的问题。my.ini 中有 属性 lower_case_table_names 可以更改此默认值,要严格区分大小写,将此项的置设置为2,再重启 MySQL 服务即可。
参考:lower_case_table_names=2

lower_case_table_names有3种值可以设置,意义如下:
0:表和数据库名在创建时以小写字母方式存储,且名称比较大小写不敏感。
1:表名以小写方式存储在磁盘中,且表名是大小写不敏感的。
2:在创建期间按照指定的名称存储,但是大小写不敏感。

http://hi.baidu.com/alongchina/blog/item/23eaf744ecb9d32ccffca32f.html

在 MySQL 中,数据库和表对应于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的。一个特例是 Mac OS X,当缺省的 HFS+ 文件系统使用时。然而 Mac OS X 还支持 UFS 卷,那些在 Mac OS X 是大小写敏感的就如他们在任一 Unix 上一样。查看章节 1.8.3 MySQL 对 ANSI SQL92 的扩展。

注意:尽管在 Windows 中数据库与表名是忽略大小写的,你不应该在同一个查询中使用不同的大小写来引用一个给定的数据库和表。下面的查询将不能工作,因为它以 my_table 和 MY_TABLE 引用一个表:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

列名与列的别名在所有的情况下均是忽略大小写的。

表的别名是区分大小写的。下面的查询将不能工作,因为它用 a 和 A 引用别名:

mysql> SELECT col_name FROM tbl_name AS a WHERE a.col_name = 1 OR A.col_name = 2;

如果记忆数据库和表名的字母大小写有困难,建议采用一个一致一约定,例如总是以小写字母创建数据库和表。

避免这个问题的另一个办法就是以 -O lower_case_table_names=1 参数启动 mysqld。缺省地在 Windows 中这个选项为 1 ,在 Unix 中为 0。

如果 lower_case_table_names 为 1 ,MySQL 将在存储与查找时将所有的表名转换为小写字线。(从 MySQL 4.0.2 开始,这个选项同样适用于数据库名。) 注意,当你更改这个选项时,你必须在启动 mysqld 前首先将老的表名转换为小写字母。

$ pwd

/data1/etl/aiinsight/ScheduleServer/mysql/support-files

$ ./mysql.server stop

$ pwd

/data1/etl/aiinsight/ScheduleServer/mysql/bin

./mysqld_safe --lower_case_table_names

方法2:修改my.cnf配置文件

在[mysqld]节下加入

lower_case_table_names=1

http://www.chinaz.com/Program/Mysql/060411N322010.html

 

9.2.2. 识别符大小写敏感性

在MySQL中,数据库对应数据目录中的目录。数据库中的每个表至少对应数据库目录中的一个文件(也可能是多个,取决于存储引擎)。因此,所使用操作系统的大小写敏感性决定了数据库名和表名的大小写敏感性。这说明在大多数Unix中数据库名和表名对大小写敏感,而在Windows中对大小写不敏感。一个显著的例外情况是Mac OS X,它基于Unix但使用默认文件系统类型(HFS+),对大小写不敏感。然而,Mac OS X也支持UFS卷,该卷对大小写敏感,就像Unix一样。参见1.8.4节,“MySQL对标准SQL的扩展”

注释: 尽管在某些平台中数据库名和表名对大小写不敏感,不应在同一查询中使用不同的大小写来引用给定的数据库或表。下面的查询不会工作,因为它同时引用了表my_tables和as MY_tables:

mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1;

列、索引、存储子程序和触发器名在任何平台上对大小写不敏感,列的别名也不敏感。

默认情况,表别名在Unix中对大小写敏感,但在Windows或Mac OS X中对大小写不敏感。下面的查询在Unix中不会工作,因为它同时引用了别名a和A:

mysql> SELECT col_name
 FROM tbl_name
 AS a
    -> WHERE a.col_name
 = 1 OR A.col_name
 = 2;

然而,该查询在Windows中是可以的。要想避免出现差别,最好采用一致的转换,例如总是用小写创建并引用数据库名和表名。在大多数移植和使用中建议使用该转换。

在MySQL中如何在硬盘上保存和使用表名和数据库名由lower_case_tables_name系统变量确定,可以在启动mysqld 时设置。lower_case_tables_name可以采用下面的任一值:

含义

0

使用CREATE TABLE或CREATE DATABASE语句指定的大写和小写在硬盘上保存表名和数据库名。名称比较对大小写敏感。在Unix系统中的默认设置即如此。请注意如果在大小写不敏感的文件系统上用--lower-case-table-names=0强制设为0,并且使用不同的大小写访问MyISAM表名,会导致索引破坏。

1

表名在硬盘上以小写保存,名称比较对大小写敏感。MySQL将所有表名转换为小写以便存储和查找。该行为也适合数据库名和表的别名。该值为Windows和Mac OS X系统中的默认值。

2

表名和数据库名在硬盘上使用CREATE TABLE或CREATE DATABASE语句指定的大小写进行保存,但MySQL将它们转换为小写以便查找。名称比较对大小写敏感。注释: 在对大小写不敏感的文件系统上适用! InnoDB表名以小写保存,例如lower_case_tables_name=1。

在Windows和Mac OS X中,lower_case_tables_name的 默认值是1。

如果只在一个平台上使用MySQL,通常不需要更改lower_case_tables_name变量。然而,如果你想要在对大小写敏感不同的文件系统的平台之间转移表,会遇到困难。例如,在Unix中,my_tables和MY_tables是两个不同的表,但在Windows中,这两个表名相同。要想避免由于数据库或表名的大小写造成的数据转移问题,可使用两个选项:

·         在任何系统中可以使用lower_case_tables_name=1。使用该选项的不利之处是当使用SHOW TABLES或SHOW DATABASES时,看不出名字原来是用大写还是小写。

·         在Unix中使用lower_case_tables_name=0,在Windows中使用lower_case_tables_name=2。这样了可以保留数据库名和表名的大小写。不利之处是必须确保在Windows中查询总是用正确大小写引用数据库名和表名。如果将查询转移到Unix中,由于在Unix中大小写很重要,如果大小写不正确,它们不工作。

例外 :如果你正使用InnoDB表,在任何平台上均应将lower_case_tables_name设置为1,以强制将名转换为小写。

请注意在Unix中将lower_case_tables_name设置为1之前,重启mysqld 之前,必须先将旧的数据库名和表名转换为小写。

http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html#name-case-sensitivity

### 配置 MySQL 5.7 大小写敏感的方法 在麒麟操作系统中配置 MySQL 5.7 数据库以实现大小写敏感的功能,可以通过调整 `lower_case_table_names` 参数完成。以下是具体的配置过程以及注意事项: #### 修改配置文件 打开 MySQL 的配置文件(通常位于 `/etc/my.cnf` 或 `/etc/mysql/my.cnf`)。如果存在该文件,则需要手动创建并放置到相应目录下。 在 `[mysqld]` 节点下添加如下配置项: ```ini [mysqld] # 忽略数据库大小写 lower_case_table_names=1 ``` 此参数的作用是将存储为小写形式,并允许通过任意大小写方式访问这些[^2]。 #### 关键点解析 - **参数含义** - 当 `lower_case_table_names=0` 时,严格区分大小写。 - 当 `lower_case_table_names=1` 时,将以小写形式存储于磁盘上,但在 SQL 查询中可以使用任何大小写方式进行匹配。 - 如果设置为 `2`,则会保留原始称,但查询时仍然转换为小写处理。过这种模式仅适用于 Windows 平台,在 Linux 下可用[^2]。 - **系统兼容性** 在 Linux 系统(如麒麟 OS)中,默认情况下文件系统通常是大小写敏感的 (`lower_case_file_system=OFF`)。这意味着即使设置了 `lower_case_table_names=1`,仍需注意底层文件系统的特性可能带来的影响[^4]。 #### 生效机制 为了使新配置生效,必须重启 MySQL 服务: ```bash sudo systemctl restart mysqld ``` 需要注意的是,一旦修改了 `lower_case_table_names` 参数,原有数据库中的某些可能会变得可访问。这是因为原有的 `.frm` 文件是以特定大小写的,而新的规则可能导致冲突或找到对应资源的情况发生[^5]。 #### 示例验证 假设已有一张为 `TestTable` 的,执行以下语句测试其行为变化: ```sql SELECT * FROM testtable; -- 若返回正常结果,则证明大小写敏感; ``` --- ### 注意事项 1. **提前备份数据** 更改此类核心配置前务必做好完整的逻辑备份与物理备份工作,以防意外丢失重要信息。 2. **统一命规范** 即便启用了大小写无关选项,建议开发人员始终遵循一致性的命约定,减少潜在混乱风险。 3. **迁移现有环境** 对已有实例应用此项改动之前,请先评估是否会对业务造成干扰,并考虑重新导入清理后的结构化数据副本。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值