mysql 表名和字段名应该大写还是小写。
核心结论:强烈推荐全部使用小写字母,并用下划线 _ 分隔单词 (即 snake_case 风格)。
理由
有关定义的理由,请参考后面的解释。
需要明确的是,因为 Linux 是大小写敏感的,如果不这么规定会有迁移问题。
mysql 表名和字段名应该大写还是小写。
核心结论:强烈推荐全部使用小写字母,并用下划线 _ 分隔单词 (即 snake_case 风格)。
有关定义的理由,请参考后面的解释。
需要明确的是,因为 Linux 是大小写敏感的,如果不这么规定会有迁移问题。
这是一个非常经典且重要的问题。
核心结论:强烈推荐全部使用小写字母,并用下划线 _ 分隔单词 (即 snake_case 风格)。
下面详细解释为什么,以及背后涉及到的技术原理。
| 类别 | 推荐规范 | 示例 | 主要理由 |
|---|---|---|---|
| 数据库、表、字段名 | 小写 + 下划线 (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 (大小写敏感)
my_table 和 My_Table 是两个完全不同的表,因为 Linux 的文件系统本身就是大小写敏感的 (MySQL 的表通常以文件的形式存储在磁盘上,如 my_table.frm)。lower_case_table_names = 1 (大小写不敏感)
CREATE TABLE My_Table (...),MySQL 也会在磁盘上创建 my_table.frm 文件。当你查询 SELECT * FROM My_Table 或 SELECT * FROM my_table 时,都能成功,因为查询时也会将表名转为小写进行比较。lower_case_table_names = 2
My_Table)。现在,想象一下这个常见的场景:
lower_case_table_names 默认为 1。你创建了一个表 OrderDetails,并在代码中写了查询 SELECT * FROM orderdetails。一切运行正常!lower_case_table_names 默认为 0。Table 'your_db.orderdetails' doesn't exist。原因:在生产服务器上,MySQL 是大小写敏感的。它在磁盘上寻找的是一个名为 orderdetails 的小写文件,但你实际创建的表(从开发环境迁移过来的)在数据库里记录的是 OrderDetails。查询因此失败。
userId,有人用 UserID,还有人用 user_id 的情况。统一的规范让代码和数据库结构保持一致。user_login_attempts 比 userloginattempts 或 UserLoginAttempts 更容易阅读和理解。Shift 键。SELECT, FROM, WHERE)大写,而将标识符(表名、字段名)小写,可以极大地提高 SQL 语句的可读性。你可以通过以下 SQL 命令查看你的 MySQL 服务器的配置:
SHOW VARIABLES LIKE 'lower_case_table_names';
重要提示:lower_case_table_names 这个变量只能在 MySQL 服务初始化时设置。一旦数据库已经创建了数据,就绝对不能去修改这个值,否则极有可能导致数据损坏或无法访问。
遵循 “标识符(数据库、表、字段)全小写,单词间用下划线分隔” 的原则,是一个简单、有效且专业的做法。它能从根本上避免许多因环境不同而产生的难以排查的错误,保证了项目的健壮性和可移植性。这是一个让你未来省心省力的好习惯。
宝塔面板也遵循这个原则吗?
最好是遵守这个原则。
以前一个系统就出过这个问题,部署的生产环境是 Linux 的,但本地的开发环境中用的是 Windows。
Windows 下不区分大小写,结果开发的表上什么乱七八糟的都有,部署上去找不到字段。
后来强制使用小写,问题就没有了。
这个世界果然是草台班子。