MySQL 表名应该大写还是小写

mysql 表名和字段名应该大写还是小写。

核心结论:强烈推荐全部使用小写字母,并用下划线 _ 分隔单词 (即 snake_case 风格)。

理由

有关定义的理由,请参考后面的解释。

需要明确的是,因为 Linux 是大小写敏感的,如果不这么规定会有迁移问题。

这是一个非常经典且重要的问题。

核心结论:强烈推荐全部使用小写字母,并用下划线 _ 分隔单词 (即 snake_case 风格)。

下面详细解释为什么,以及背后涉及到的技术原理。


TL;DR (太长不看版)

类别 推荐规范 示例 主要理由
数据库、表、字段名 小写 + 下划线 (snake_case) my_database, user_profile, order_amount 跨平台兼容性、可读性、避免混淆
SQL 关键字 大写 SELECT, FROM, WHERE, JOIN 提升可读性,与表/字段名形成对比

一个好的 SQL 示例:

SELECT
    user_id,
    user_name,
    register_time
FROM
    user_accounts
WHERE
    is_active = 1;

详细解释:为什么必须用小写?

最根本的原因在于 MySQL 的大小写敏感性策略与操作系统有关

MySQL 有一个非常重要的系统变量叫做 lower_case_table_names,它决定了数据库和表名在存储和查询时如何处理大小写。这个变量有三种常见的值:

  • lower_case_table_names = 0 (大小写敏感)

    • 存储和比较都区分大小写
    • 这是 Linux/Unix 系统 的默认设置。
    • 在这些系统上,my_tableMy_Table 是两个完全不同的表,因为 Linux 的文件系统本身就是大小写敏感的 (MySQL 的表通常以文件的形式存储在磁盘上,如 my_table.frm)。
  • lower_case_table_names = 1 (大小写不敏感)

    • 存储时,MySQL 会将所有表名和数据库名转换为小写
    • 比较时不区分大小写
    • 这是 Windows 和 macOS 的默认设置。
    • 在这些系统上,即使你执行 CREATE TABLE My_Table (...),MySQL 也会在磁盘上创建 my_table.frm 文件。当你查询 SELECT * FROM My_TableSELECT * FROM my_table 时,都能成功,因为查询时也会将表名转为小写进行比较。
  • lower_case_table_names = 2

    • 存储时,按你创建时的大小写来保存(例如 My_Table)。
    • 比较时,转换为小写进行比较(不区分大小写)。
    • 这种模式不常用,且容易引起混淆,不推荐使用。

核心问题:迁移和协作的噩梦

现在,想象一下这个常见的场景:

  1. 开发环境:你在自己的 Windows 或 Mac 电脑上开发。lower_case_table_names 默认为 1。你创建了一个表 OrderDetails,并在代码中写了查询 SELECT * FROM orderdetails。一切运行正常!
  2. 生产环境:你将代码部署到公司的 Linux 服务器上。Linux 服务器上的 MySQL lower_case_table_names 默认为 0
  3. 灾难发生:你的应用在生产环境上报错:Table 'your_db.orderdetails' doesn't exist

原因:在生产服务器上,MySQL 是大小写敏感的。它在磁盘上寻找的是一个名为 orderdetails 的小写文件,但你实际创建的表(从开发环境迁移过来的)在数据库里记录的是 OrderDetails。查询因此失败。

采用“全小写+下划线”规范的好处

  1. 终极的跨平台兼容性:无论你的数据库是在 Windows, macOS, 还是 Linux 上运行,你的 SQL 语句永远不会因为大小写问题而出错。这是最重要的理由。
  2. 避免混淆:团队协作时,不会出现有人用 userId,有人用 UserID,还有人用 user_id 的情况。统一的规范让代码和数据库结构保持一致。
  3. 良好的可读性user_login_attemptsuserloginattemptsUserLoginAttempts 更容易阅读和理解。
  4. 输入方便:无需在输入表名和字段名时切换 Shift 键。
  5. 与 SQL 关键字区分:将 SQL 关键字(SELECT, FROM, WHERE)大写,而将标识符(表名、字段名)小写,可以极大地提高 SQL 语句的可读性。

如何检查你当前的设置?

你可以通过以下 SQL 命令查看你的 MySQL 服务器的配置:

SHOW VARIABLES LIKE 'lower_case_table_names';

重要提示lower_case_table_names 这个变量只能在 MySQL 服务初始化时设置。一旦数据库已经创建了数据,就绝对不能去修改这个值,否则极有可能导致数据损坏或无法访问。

总结

遵循 “标识符(数据库、表、字段)全小写,单词间用下划线分隔” 的原则,是一个简单、有效且专业的做法。它能从根本上避免许多因环境不同而产生的难以排查的错误,保证了项目的健壮性和可移植性。这是一个让你未来省心省力的好习惯。

宝塔面板也遵循这个原则吗?

最好是遵守这个原则。

以前一个系统就出过这个问题,部署的生产环境是 Linux 的,但本地的开发环境中用的是 Windows。

Windows 下不区分大小写,结果开发的表上什么乱七八糟的都有,部署上去找不到字段。

后来强制使用小写,问题就没有了。

这个世界果然是草台班子。

1 Like