phpMyAdmin:FROM 后忽略默认数据库

Posted

技术标签:

【中文标题】phpMyAdmin:FROM 后忽略默认数据库【英文标题】:phpMyAdmin: default database ignored after FROM 【发布时间】:2015-04-07 05:21:34 【问题描述】:

这是一个非常烦人的异常,只发生在 phpMyAdmin 中,不会通过 php 的 mysqli 或 mysql 命令行发生。

我有两个数据库,foobarfoo.bananaTable.monkeyIdbar.monkey.id 的外键

因此,无论您在何处执行它,下面的 SQL 都可以正常工作:

SELECT bananaTable.ripeness as 'ripeness'
FROM bar.monkey as monkey
JOIN foo.bananaTable as bananaTable ON bananaTable.monkeyId = monkey.id

现在,如果您在 phpMyAdmin 中导航到 foo 数据库,如果您没有在 SQL 中明确命名一个,它会有效地使用 foo 作为您的默认数据库。因此,下面的 SQL(在 JOIN 中省略了 foo db 范围)应该工作......

SELECT bananaTable.ripeness as 'ripeness'
FROM bar.monkey as monkey
JOIN bananaTable as bananaTable ON bananaTable.monkeyId = monkey.id

它确实可以在 php mysqli 和 mysql 命令行中工作。但它在 phpMyAdmin 中不起作用您收到一条错误消息 #1146 Table "bar.bananaTable" doesn't exist

这告诉我 FROM 完全劫持了我在 phpMyAdmin 中的默认数据库。事实上,如果您编辑它并再次运行它,您会注意到它实际上已将您移至 bar 数据库... WTF?

好的,所以我又尝试了一件事情:

USE foo;
SELECT bananaTable.ripeness as 'ripeness'
FROM bar.monkey as monkey
JOIN bananaTable as bananaTable ON bananaTable.monkeyId = monkey.id

...尝试强迫它。仍然没有工作!

有人看过吗?这只是 phpMyAdmin 试图太聪明的产物吗?有没有以这个为中心的配置?或者这是我需要注意的 MySql 中的一些奇怪之处?我完全是为了明确的数据库命名,但出于安全原因,我们从一开始就指定一个默认值。

【问题讨论】:

【参考方案1】:

未指定 phpMyAdmin 版本,但似乎与版本无关。以下测试在最新版本的 phpMyAdmin 中显示了相同的行为。对我来说似乎是一个错误。

-- http://demo.phpmyadmin.net/master-config
-- phpMyAdmin Demo Server: Currently running Git revision RELEASE_4_3_0RC2-1597-g6111104

-- Create table in test database

CREATE TABLE IF NOT EXISTS bar (
  id int(11) NOT NULL,
  `name` varchar(20) NOT NULL,
  fooID int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;

INSERT INTO bar (id, name, fooID) VALUES
(1, 'first', 1),
(2, 'second', 2);

ALTER TABLE bar
  ADD PRIMARY KEY (id);

-- Create table in world database

CREATE TABLE IF NOT EXISTS `foo` (
  `id` int(11) NOT NULL,
  `val1` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `foo` (`id`, `val1`) VALUES
(1, 10),
(2, 15);

ALTER TABLE `foo`
  ADD PRIMARY KEY (`id`);

-- from world database, where table foo resides

-- this query shows world as the default/selected database, as expected.

SELECT DATABASE();

-- this query should work from world, but fails with #1146 - Table 'test.foo' doesn't exist 

SELECT b.*, f.val1 
FROM test.bar AS b 
LEFT JOIN foo AS f ON f.id = b.fooID
WHERE 1;

-- this query succeeds with an explicit world.foo, but it shouldn't be required

SELECT b.*, f.val1 
FROM test.bar AS b 
LEFT JOIN world.foo AS f ON f.id = b.fooID
WHERE 1;

【讨论】:

以上是关于phpMyAdmin:FROM 后忽略默认数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何创建`phpmyadmin`数据库

更改 documentroot 后,xampp 仍然使用默认的 phpmyadmin

PhpMyAdmin 表导出忽略时间戳列

phpMyAdmin 将列设置为主键但 Laravel 模型忽略

phpMyAdmin如何将InnoDB数据表类型 转换修改成MyISAM默认引擎?

Docker phpmyadmin 忽略了我的 php.ini 配置