我们有一个项目,要求我们从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驱动程序
/etc/odbc.ini中的MySQL ODBC设置
因此,当他们从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查询外部数据库时是否适用?
答案 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/