mysql 5.7 数据库表名大小写问题怎么解决

"Message": "登录失败: Table 'dingban.SysUser' doesn't exist",

MySQL 5.7 报 Table 'dingban.SysUser' doesn't exist 核心是表名大小写敏感导致的匹配失败(比如实际表名是 sysuser/sys_user,代码里写了 SysUser)。以下是「快速临时解决」+「永久根治」的完整方案,适配 MySQL 5.7 特性:

一、先明确 MySQL 5.7 大小写敏感规则

MySQL 5.7 表名大小写是否敏感,由两个核心参数控制: | 参数 | 作用 | 默认值(Linux/Windows) | |------|------|-------------------------| | lower_case_table_names | 控制表名存储/匹配的大小写规则:
0 = 大小写敏感(Linux 默认)
1 = 表名转小写存储,查询时忽略大小写(Windows 默认)
2 = 表名按原大小写存储,查询时转小写(仅 macOS) | Linux=0,Windows=1 | | lower_case_file_system | 标识文件系统是否大小写敏感(只读,无法修改):
0 = 敏感(Linux),1 = 不敏感(Windows) | 随系统自动识别 |

二、方案1:临时解决(无需重启 MySQL,快速验证)

适合测试环境/临时应急,直接修改当前会话的大小写规则:

-- 登录 MySQL 执行(仅对当前会话生效,重启后失效)
SET @@session.lower_case_table_names = 1;

-- 验证是否生效
SELECT @@lower_case_table_names; -- 返回 1 即生效

此时再执行代码中的查询(如 SELECT * FROM SysUser),会自动匹配小写表名(如 sysuser),解决不存在的问题。

三、方案2:永久解决(修改配置,重启 MySQL)

适合生产环境,彻底统一大小写规则(推荐设置为 1,兼容跨系统开发):

步骤1:修改 MySQL 配置文件

找到 MySQL 5.7 的配置文件(不同系统路径不同):

  • Linux:/etc/my.cnf/etc/mysql/my.cnf
  • Windows:my.ini(通常在 MySQL 安装目录的 my.ini

[mysqld] 节点下添加/修改:

[mysqld]
# 核心配置:表名转小写存储,查询忽略大小写
lower_case_table_names = 1
# 可选:确保字符集统一(避免其他乱码问题)
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

步骤2:重启 MySQL 服务

# Linux
systemctl restart mysqld (CentOS)/ systemctl restart mysql(Ubuntu)

# Windows(CMD 管理员权限)
net stop mysql && net start mysql

步骤3:验证配置生效

-- 登录 MySQL 执行
SELECT @@global.lower_case_table_names; -- 返回 1 即永久生效

四、关键注意事项(必看!避免踩坑)

  1. 修改 lower_case_table_names = 1 前的准备

    • 若已有大写表名(如 SysUser),需先手动重命名为小写(否则重启后可能无法识别):
      -- 将大写表名改为小写
      RENAME TABLE dingban.SysUser TO dingban.sysuser;
      
    • Linux 系统中,lower_case_table_names 只能在 MySQL 首次初始化前 从 0 改 1;若已初始化,需先停止 MySQL → 删除数据目录(如 /var/lib/mysql)→ 修改配置 → 重新初始化(谨慎!会清空数据)。
  2. 代码层面规范(根治根源): 无论数据库配置如何,代码中表名建议统一小写(如 sysuser),避免跨环境(Linux/Windows)兼容问题:

    • 示例(Java/MyBatis):
      <!-- 原错误写法:SysUser(大写) -->
      <select id="getUser" resultType="SysUser">
          SELECT * FROM sysuser WHERE id = #{id}
      </select>
      
    • 示例(EF Core):
      // 显式指定表名小写
      [Table("sysuser")]
      public class SysUser { ... }
      
  3. 避免的错误操作

    • 不要在 Linux 系统中将 lower_case_table_names 设为 2(不支持,会启动失败);
    • 不要直接修改 lower_case_file_system(只读参数,修改无效)。

五、排查:确认实际表名

若修改后仍报错,先确认数据库中实际表名:

-- 查看 dingban 库下的所有表名(注意库名小写)
USE dingban;
SHOW TABLES;

-- 或查询表名(忽略大小写)
SELECT table_name FROM information_schema.tables WHERE table_schema = 'dingban' AND LOWER(table_name) = 'sysuser';
  • 若查询无结果:说明表确实不存在,需先创建表;
  • 若查询有结果:说明表名大小写不匹配,按上述方案统一即可。

总结

  1. 临时应急:执行 SET @@session.lower_case_table_names = 1;
  2. 永久解决:修改 my.cnf/my.inilower_case_table_names = 1,重启 MySQL;
  3. 根源规范:代码中表名统一小写,避免跨环境兼容问题。

按此操作后,SysUser/sysuser/SYSUSER 都会匹配到实际表名,彻底解决「表不存在」的问题。

在数据库 dingban 运行 SQL 查询 查询所有的表,给有id字段的表, 添加自增