(zt)MySQL的大小写敏感性 lower_case_table_names

本文介绍了MySQL中数据库和表名的大小写敏感性问题,并提供了如何通过调整mysqld的启动参数来统一处理该问题的方法。

2008-09-23 15:32

在 MySQL 中,数据库和表对就于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的。

奇怪的是列名与列的别名在所有的情况下均是忽略大小写的,而表的别名又是区分大小写的。

要避免这个问题,你最好在定义数据库命名规则的时候就全部采用小写字母加下划线的组合,而不使用任何的大写字母。

或者也可以强制以 -O lower_case_table_names=1 参数启动 mysqld(如果使用 --defaults-file=.../my.cnf 参数来读取指定的配置文件启动 mysqld 的话,你需要在配置文件的 [mysqld] 区段下增加一行 lower_case_table_names=1)。这样MySQL 将在创建与查找时将所有的表名自动转换为小写字符(这个选项缺省地在 Windows 中为 1 ,在 Unix 中为 0。从 MySQL 4.0.2 开始,这个选项同样适用于数据库名)。

当你更改这个选项时,你必须在启动 mysqld 前首先将老的表名转换为小写字母。

换句话说,如果你希望在数据库里面创建表的时候保留大小写字符状态,则应该把这个参数置0: lower_case_table_names=0 。否则的话你会发现同样的sqldump脚本在不同的操作系统下最终导入的结果不一样(在Windows下所有的大写字符都变成小写了)。

<think> 我们正在讨论PostgreSQL中表名的大小写问题。用户提到在创建表时使用双引号包裹表名:CREATE TABLEzt_autoReCheckInfo"(注意:用户输入的双引号是中文的,但实际SQL中应该使用英文双引号)。在PostgreSQL中,如果使用双引号包裹表名,那么表名就会按照双引号内的大小写形式存储。因此,如果执行: ```sql CREATE TABLE "zt_autoReCheckInfo" (...); ``` 那么表名就会保持为`zt_autoReCheckInfo`(注意大小写)。 但是,在SQL语句中引用这个表时,也必须使用双引号包裹,否则PostgreSQL会将其转换为小写,从而找不到该表。例如: ```sql SELECT * FROM zt_autoReCheckInfo; -- 错误,因为会被转换为小写,而实际表名是混合大小写的 SELECT * FROM "zt_autoReCheckInfo"; -- 正确 ``` 因此,在SQLAlchemy中,如果表名在数据库中是混合大小写的,那么在定义Table对象时,必须使用双引号(即标识符需要加引号)。在SQLAlchemy中,可以通过设置`quote=True`来达到这个效果。 例如: ```python from sqlalchemy import Table, MetaData metadata = MetaData(schema="ods_zt") table = Table('zt_autoReCheckInfo', metadata, ..., quote=True) # 这样生成的SQL语句中表名会被双引号包裹 ``` 但是,通常建议避免使用混合大小写的表名,因为这样在编写SQL时需要总是使用双引号,比较麻烦。如果不使用双引号,PostgreSQL会自动转换为小写。 现在,回答用户的问题:使用`CREATE TABLEzt_autoReCheckInfo"`(注意:这里用户用的是中文双引号,实际应该用英文双引号)在PostgreSQL中创建的表名是`zt_autoReCheckInfo`,但是后续引用必须同样使用双引号,否则会出错。 因此,用户的问题的答案是:是的,使用双引号(英文)创建表,表名就会是`zt_autoReCheckInfo`(保留大小写),但是后续查询也必须使用双引号引用该表名。 接下来,我们需要按照要求提出3-5个相关问题。 §§相关问题§§ 1. 在PostgreSQL中,如何查看一个表是否是用双引号创建的(即表名是否区分大小写)? 2. 在SQLAlchemy中,如何设置表名在生成SQL时自动添加双引号? 3. 如果已经存在一个混合大小写表名的表,如何在SQLAlchemy的ORM模型中正确引用它? 4. 除了双引号,PostgreSQL中还有哪些方式可以处理标识符的大小写问题? 5. 在PostgreSQL中,使用双引号包裹标识符有哪些利弊? </think> 根据您的描述,问题出在**SQL语法和引号使用**上。以下是详细分析: ### 问题解析 1. **SQL语法错误** `CREATE TABLEzt_autoReCheckInfo"` 存在两个关键问题: - 使用了**中文双引号** `”` 和 `"`(混合了全角/半角符号) - **引号位置错误**:正确语法应为 `CREATE TABLE "zt_autoReCheckInfo"` 2. **PostgreSQL的处理逻辑** - ✅ 正确语法:`CREATE TABLE "zt_autoReCheckInfo"` → 创建**区分大小写**的表名(原样存储为 `zt_autoReCheckInfo`) - ❌ 当前错误写法:`CREATE TABLEzt_autoReCheckInfo"` → 引号不匹配导致语法错误,实际会创建默认小写表名 `zt_autorecheckinfo` 3. **验证方法** 在psql中执行: ```sql SELECT tablename FROM pg_tables WHERE tablename ILIKE 'zt_autorecheckinfo'; ``` 若返回表名为 `zt_autorecheckinfo`(全小写),则证实未正确创建区分大小写的表。 --- ### 解决方案 1. **重建表(正确语法)** ```sql DROP TABLE IF EXISTS "zt_autoReCheckInfo"; -- 先删除错误表 CREATE TABLE "zt_autoReCheckInfo" ( -- 使用英文双引号包裹 id SERIAL PRIMARY KEY, ... -- 其他字段 ); ``` 2. **SQLAlchemy声明(Python示例)** ```python from sqlalchemy import Table, Column, Integer, MetaData metadata = MetaData(schema="ods_zt") # 使用quote=True强制保留大小写 zt_table = Table("zt_autoReCheckInfo", metadata, Column('id', Integer, primary_key=True), quote=True # 关键参数 ) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值