phpMyAdmin:FROM 后忽略默认数据库
Posted
技术标签:
【中文标题】phpMyAdmin:FROM 后忽略默认数据库【英文标题】:phpMyAdmin: default database ignored after FROM 【发布时间】:2015-04-07 05:21:34 【问题描述】:这是一个非常烦人的异常,只发生在 phpMyAdmin 中,不会通过 php 的 mysqli 或 mysql 命令行发生。
我有两个数据库,foo
和 bar
。foo.bananaTable.monkeyId
是 bar.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 后忽略默认数据库的主要内容,如果未能解决你的问题,请参考以下文章
更改 documentroot 后,xampp 仍然使用默认的 phpmyadmin
phpMyAdmin 将列设置为主键但 Laravel 模型忽略