MySQL表名大小写敏感由lower_case_table_names参数控制:Windows默认为1(不区分),Linux/macOS默认为0(区分);该参数不可动态修改,必须在my.cnf或my.ini的[mysqld]段配置并重启生效;值为0时严格区分大小写,1时强制小写存储与匹配,2时仅比较不区分但存储保留原样。

MySQL表名大小写敏感由lower_case_table_names控制
Windows下默认不区分大小写,Linux/macOS默认区分——这不是XAMPP的问题,而是MySQL底层行为。XAMPP在Windows安装时会自动设lower_case_table_names=1,但若你在Linux上用XAMPP(比如CentOS 7的/opt/lampp),它默认是0,导致SELECT * FROM User和SELECT * FROM user可能报错或查不到数据。
这个参数必须在MySQL启动前设置,运行中无法修改,改完不重启等于没改。
-
lower_case_table_names=0:表名按创建时的大小写存储,查询也必须完全匹配(Linux默认) -
lower_case_table_names=1:表名转小写存储并统一按小写比较(Windows默认,兼容性好) -
lower_case_table_names=2:仅对查询时的比较忽略大小写,存储仍保留原样(不推荐,易混淆)
修改位置是my.ini(Windows)或my.cnf(Linux)
XAMPP的配置文件路径取决于系统:
- Windows:
\xampp\mysql\bin\my.ini - Linux:
/opt/lampp/etc/my.cnf(注意不是/opt/lampp/etc/mysql/my.cnf)
找到[mysqld]段,在其下方新增一行:
lower_case_table_names = 1
⚠️关键点:不能加在[client]或[mysql]段里,否则无效;也不能拼错成lower_case_table_name(少个s);值只能是数字,不能写on或true。
改完后必须先停止MySQL:sudo /opt/lampp/lampp stopmysql(Linux)或在XAMPP控制面板点stop,再启动,否则参数不加载。
改完lower_case_table_names后,已有表名不会自动转换
这个参数只影响后续新建的表和查询行为,不会重命名磁盘上的.frm或.ibd文件。如果你之前建了User表,现在设为1,再用SELECT * FROM user能查到,但SHOW TABLES仍显示User(实际文件名未变)。
真正想统一成小写?得手动操作:
- 导出数据:
mysqldump -u root -p database_name table_name > table_name.sql - 删旧表:
DROP TABLE User; - 用小写名重建:
CREATE TABLE user (...); - 导入:
mysql -u root -p database_name
跳过这步直接改参数,只是让SQL语句“宽容”一点,不是让文件系统变小写。
PHP/PHPMyAdmin连接时大小写问题常被误判为权限或路径错误
典型现象:PHP代码里写$pdo = new PDO("mysql:host=localhost;dbname=test", "root", "");能连,但SELECT * FROM AdminUser报Table 'test.AdminUser' doesn't exist,而SHOW TABLES里明明有adminuser——这就是lower_case_table_names=0在作祟。
排查顺序建议:
- 先确认当前值:
mysql -u root -p -e "SELECT @@lower_case_table_names;" - 再看真实表名:
mysql -u root -p -e "USE test; SHOW TABLES;"(注意输出里的实际大小写) - 最后检查代码里写的表名是否和
SHOW TABLES结果**逐字符一致**
别急着改代码,先看MySQL自己认什么名。很多所谓“连接失败”,其实是表名拼错了大小写,而你根本没意识到MySQL在较真。


















