【问题标题】:a little bit confusing about a syntax on my databases MySQL对我的数据库 MySQL 上的语法有点困惑
【发布时间】:2019-01-05 14:02:36
【问题描述】:

我尝试检查我的数据库:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| db1                |
| db2                |
| sys                |
+--------------------+
6 rows in set (0,09 sec)

我也尝试检查我的数据库:

mysql> SELECT Db FROM mysql.db;
+--------------------+
| Db                 |
+--------------------+
| performance_schema |
| sys                |
| db1                |
| db2                |
| db1                |
| db2                |
+--------------------+
6 rows in set (0,00 sec)

为什么SHOW DATABASES;SELECT Db FROM mysql.db; 的结果不同?

我可以在mysql.db 表上更新我的数据库吗??

提前致谢。

【问题讨论】:

  • 最好远离系统数据库。如果您想了解您的数据库,请使用 information_schema.tables、Information_schema.columns 等
  • mysql.db 是一个内部表。不要使用它来更改您的数据库,因为通过更新此表,您将绕过 MySQL 为您做的一些家务,并有损坏数据库的风险。请改用SHOW DATABASESCREATE DATABASE 等。
  • @AlexandervanOostenrijk P.Salmon 为什么我在mysql.db 表上有多个db1 数据库?
  • 如果您转储 db 表的所有列,您会看到 MySQL 在您的数据库中存储了不同位的信息,这就是为什么其中一些可能会出现多次。

标签: mysql sql syntax


【解决方案1】:

mysql.db 是一个内部系统表,因此很难找到相关的官方文档。我找到了this MariaDB documentation,上面写着:

mysql.db 是一个系统表,包含有关数据库级权限的信息

这个表是关于存储用户的GRANTS(这解释了为什么你会多次看到同一个数据库)。 显然它不是查找可用数据库的好地方。

为此,最好使用SHOW DATABASESthe information schema

【讨论】:

    【解决方案2】:

    您可以通过三种方式查找数据库信息:

    1. mysql 数据库,这是 MySQL 服务器自身用于自己记账的内部架构。
    2. SHOW 命令,这是最早向最终用户公开信息的机制。
    3. information_schema 数据库,这是一个具有动态生成表的“虚拟”数据库,后来作为SHOW 命令的增强功能实现。

    您应该使用除第一个之外的任何内容(主要是因为它不包含您认为的内容,而且还因为普通用户永远不应该拥有对其的读取权限)。在实践中,我发现是否使用 SHOWinformation_schema 取决于服务器:它们有时具有非常不同的性能,并且您并不总是具有架构的权限。

    【讨论】:

      【解决方案3】:

      有趣的事实:您可以删除一个数据库,但仍然可以在 mysql.db 上找到它的名称。所以这是你不能依赖的另一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多