在 MySQL 中,lower_case_table_names
全局变量决定表名写入磁盘时是否保留字母大小写,以及表名匹配是否区分大小写。根据the docs :
If you are using InnoDB or MySQL Cluster (NDB) tables, you should set this variable to 1 on all platforms to force names to be converted to lowercase.
我的网站运行在 Apache 2.4 上,带有 MySQL 5.6.23 和 PHP 5.5.25。我的大部分表都是 MyISAM,但我想将它们转换为 InnoDB。根据上面的指令,我尝试在MySQL的配置文件中设置lower_case_table_names=1
。但是,重新启动服务器后,我无法再使用 mysqli 扩展从 PHP 代码连接到数据库。代码 $this->mysqli = new\mysqli($host,$user,$pwd,$db_name,$port);
返回 mysqli->connect_error = "Access returned for user '用户名'@'localhost'(使用密码:YES)”
。我确信登录凭据是好的,原因如下:
- 在 PHP 环境之外,我可以使用以下命令连接到数据库 使用远程工具 (SQLyog) 获得相同的凭据。
- 如果我从配置文件中删除
lower_case_table_names=1
行并 重新启动服务器,一切恢复正常。
在 MySQL 服务器启动过程中 -- 当 lower_case_table_names=1
时 -- 错误日志显示 3 个警告:
[警告] 具有隐式 DEFAULT 值的 TIMESTAMP 已被弃用。请 使用 --explicit_defaults_for_timestamp 服务器选项(请参阅 文档以获取更多详细信息)。
[警告]“db”条目“%_ldap_ou=地址簿 cpldap@localhost”有 混合大小写的数据库已被迫小写,因为 lower_case_table_names 已设置。将无法删除此内容 使用 REVOKE 授予权限。
[警告]“db”条目“logaholicdb_host logaholic@localhost”有 混合大小写的数据库已被迫小写,因为 lower_case_table_names 已设置。将无法删除此内容 使用 REVOKE 授予权限。
这两个配置下还记录了几个[Note]
条目。删除 lower_case_table_names=1
行后,仅出现第一个警告。被拒绝访问的用户对相关数据库具有以下权限(SHOW GRANTS FOR 'username'@'localhost';
的结果)
- GRANT USAGE ON . TO 'username'@'localhost' IDENTIFIED BY PASSWORD '*6DF294D9BAA539074CFC4DD08E77909FE53CFCE1'
- GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE ON
my_db
.* TO 'username'@'localhost'
为什么连接失败以及如何修复它?
最佳答案
第 1 步:首先通过 mysqldump 命令备份数据库(所有故事)。
第 2 步:现在将您的配置设置更改为小写。
第三步:现在重新启动mysql服务。
第四步:现在恢复备份。
默认情况下,所有表名称都以小写形式写入磁盘,甚至您可以通过小写/大写/驼峰形式调用它们,但实际上它们将以小写形式存储在服务器上。
关于php - MySQL lower_case_table_names 导致 PHP 连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31846823/