从Oracle查询MySQL需要在字段名称周围加上引号

时间:2019-05-24 12:57:19

标签: mysql sql oracle

我们有一个项目,要求我们从Oracle查询MySQL数据库。数据库实例位于单独的Linux服务器上。

开发人员遇到的问题已经很久了,他们必须在字段名称周围使用双引号。

MySQL数据库是使用小写的表和字段名称创建的。示例:

CREATE TABLE IF NOT EXISTS web_access_log (
  ip_address varchar(16) NOT NULL,
  request varchar(256) NOT NULL,
  last_request_date datetime NOT NULL,
  count_last_date int(10) unsigned DEFAULT NULL,
  total_hits int(10) unsigned DEFAULT NULL,
  burst_start_date datetime DEFAULT NULL,
  KEY index1 (last_request_date),
  KEY ip_address (ip_address,request(255),last_request_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

最近,我将lower_case_table_names添加到/etc/my.cnf.d/server.cnf中,将其设置为“ 1”

[mysqld]
lower_case_table_names=1

有关Oracle方面的信息:

用于连接到MySQL的驱动程序是/etc/odbcinst.ini中的unixODBC驱动程序

enter image description here

/etc/odbc.ini中的MySQL ODBC设置

enter image description here

因此,当他们从unixODBC命令行isql查询MySQL并发出简单的select userid from web_user_group时,一切似乎都正常。

但是,如果他们通过Oracle PL / SQL命令行连接,则会收到错误“ USERID”:无效的缩进符

最后,从PL / SQL命令行,如果它们在字段名称select "userid" from web_user_group周围加上引号,则查询有效。

我了解大多数Linux版本都区分大小写,

  

因此,底层操作系统的区分大小写在数据库,表和触发器名称的区分大小写中起作用。这意味着这些名称在Windows中不区分大小写,但在大多数Unix版本中都区分大小写。

Taken from MySQL documentation 9.2.2 Identifier Case Sensitivity

那么这是由驱动程序控制还是Oracle的“功能”控制,开发人员必须忍受它?

我已经阅读了SO上的this答案以及关于SO上类似问题的this答案。

但是,这些答案使我相信这是特定于Oracle的。但是从Oracle查询外部数据库时是否适用?

1 个答案:

答案 0 :(得分:0)

This MariaDB document关于ODBC区分大小写的一些说明:

  

例如,Oracle在这里遵循SQL标准。它将未引用的标识符转换为大写。这是正确的和预期的。 PostgreSQL不是标准的。它将标识符转换为小写。 MySQL / MariaDB不是标准的。它们在Linux上保留标识符,并在Windows上转换为小写。

但是,您链接的MySQL文档说:

  

,索引,存储的例程,事件和资源组名称在任何平台上都不区分大小写,列别名也不区分大小写。

由于您的问题是列名“ userid”区分大小写,因此我认为问题可能出在MySQL ODBC驱动程序上,因为这听起来像是MySQL的正常行为。

您可以尝试将myodbc连接器(即驱动程序库)从版本5升级到版本8,但我不知道这是否有帮助-https://dev.mysql.com/downloads/connector/odbc/