MySQL报错Ignoring query to other database的真正原因

大家都知道报这个错的原因是忘了用户名前加-u这个参数造成的,比如是这样登录了MySQL

mysql -root -p (注意看,-root前面没有加u)

登录后,不管你执行什么命令,都会提示Ignoring query to other database

mysql>show databases;
Ignoring query to other database

要解决这个问题,只要退出后加上-u这个参数就可以了。 # mysql -uroot -p

网上很多都写到这里为止了,但并没有去分析为什么没有加-u也能登录成功,为什么登录成功后执行sql语句会报错。

这里我就给大家分析一下为什么会这样的真正原因。

这是因为当没有带上-u执行 “mysql -root -p ”时,mysql命令把-root识别成了它的参数,而不是root这个用户。并且把root这个词识别成了四个参数,拆开来就是“-r -o -o -t"。

当不带有-u参数时,默认就是以root用户登录的。

所以当没有带-u参数时,整个命令其实是这样的:

#mysql -r -o -o -t -p -uroot //其中-uroot是隐式带上的

所以虽然没有带上-u参数,是可以登录成功的,而登录成功后,报错,是因为有-o这个参数造成的。

我们看看-o这个参数的解释:

-o,--one-database
Ignore statements except those that occur while the default database is the one named on the command line. This option is rudimentary and should be used with care. Statement filtering is based only on USE statements.

翻译过来就是,当带上-o参数时,会忽略sql语句,但如果在-o参数后面带上某数据库名,这个数据库可以排除在外,也就是这个数据库可以执行sql语句。

比如我们想登录数据库后,只能在mysql这个数据库执行命令sql命令,在其它数据库中都执行不了sql命令

# mysql -o mysql -p
mysql> use test
Database changed
mysql> show tables;
Ignoring query to other database
mysql> use mysql
Database changed
mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
24 rows in set (0.00 sec)

mysql> select * from test.test1;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

mysql>; use test
Database changed
mysql> select * from mysql.user;
Ignoring query to other database

可以看出,当使用use切换到mysql数据库,就可以执行sql命令,当使用use切换到别的数据库下,就执行不了,会报错。

知道这个-o参数的作用后,我们就知道为什么前面登录后执行命令会报错了。