许多关系型数据库以不直接对应于 MySQL 所称数据库的方式引用 CATALOG 和 SCHEMA。它既不是 CATALOG 也不是 SCHEMA。一般来说,目录是模式的集合,因此完全限定的名称看起来像 catalog.schema.table.column
。在 MySQL ODBC 驱动程序的历史上,CATALOG 和 DATABASE 是用于同一事物的两个名称。同时,SCHEMA 通常用作 MySQL 数据库的同义词。这表明 CATALOG 等于 SCHEMA,这是不正确的,但在 MySQL 服务器上下文中它们将是同一事物。
在 ODBC 中,在引用数据库对象(如表)时可以使用模式和目录。关于如何解释这些模式和目录概念的期望在开发人员之间有所不同,这就是为什么 NO_CATALOG 和 NO_SCHEMA 选项存在的原因:为了涵盖所有这些期望并允许显式地禁用将 ODBC 函数参数解释为 CATALOG 或 SCHEMA。
Connector/ODBC 驱动程序不允许同时使用目录和模式功能,因为这会导致不支持的命名。但是,某些软件(如 MS SQL Server)可能会尝试通过链接服务器对象来做到这一点。这就是为什么 Connector/ODBC 8.0.26 为 MySQL ODBC 驱动程序添加了 NO_SCHEMA 选项以报告模式不受支持的原因,对于目录而言,NO_CATALOG 选项已经这样做了。使用 NO_SCHEMA 会导致驱动程序通过 SQLGetInfo() 调用报告模式操作不受支持。结果,客户端软件不会尝试将表访问为 catalog.schema.table,而是访问为 catalog.table。
表 8.1 Connector/ODBC NO_CATALOG 和 NO_SCHEMA 组合
NO_CATALOG | NO_SCHEMA | 描述和注释 |
---|---|---|
true |
true |
驱动程序不支持目录或模式。 |
false |
true |
目录受支持并解释为 MySQL 数据库名称,指定模式会触发错误。 |
true |
false |
模式受支持并解释为 MySQL 数据库名称,指定目录会触发错误。 |
false |
false |
目录和模式都受支持,但如果同时指定两者,则为错误。如果只指定目录或模式,则将其解释为 MySQL 数据库名称。 |