无法从 information_schema (MySQL/MariaDB) 访问列名
Posted
技术标签:
【中文标题】无法从 information_schema (MySQL/MariaDB) 访问列名【英文标题】:Unable to access column names from information_schema (MySQL/MariaDB) 【发布时间】:2020-10-26 21:33:52 【问题描述】:我正在尝试从特定表中获取列名。
编辑: 一开始我忘了提,但是 python 脚本,即获取表名没有任何问题(不同的查询),但是选择列名的那个会出错。
当我在 DBeaver 的 SQL 编辑器中编写此查询(见下文)时,我得到了预期的结果。但是当我在我的 python 脚本中运行查询时,我收到一个错误,即 COLUMN_NAME 不存在。
SELECT column_name FROM information_schema.columns WHERE table_schema=<database-name> AND table_name=<table-name>;
(真实查询中db名和表名写正确)
我还需要提一下,当我之前使用 mysql Workbench 时,这个用 python 编写的查询按预期工作。当我切换到 DBeaver 进行数据库管理时,问题就出现了。
为了让 information_schema 按预期工作,我是否可能需要在 DBeaver 内部执行一些进一步的步骤?
mysql --version >> mysql Ver 15.1 Distrib 10.4.13-MariaDB, for Linux (x86_64) using EditLine wrapper
【问题讨论】:
你在自相矛盾(首先你写的查询在 dbeaver 中工作,然后你写的没有)。 @Shadow 我已经重新提出了这个问题。感谢您指出。 更改用于管理 mysql 实例的客户端不会对连接到同一 mysql 服务器的程序产生任何影响。您必须更改了配置或访问控制中的某些内容才能导致 mysql 语句中的错误。 @Shadow PyMySql 是否有可能无法使用 MariaDB 完成所有查询?该程序最初是用 MySQL 而不是 MariaDB 测试的,但我使用的查询语法应该是相同的。编辑:因为我觉得它令人困惑,所以所有其他查询都有效,除了列名的查询。 这是一个很常见的错误:mariadb is not mysql! Mariadb 是 mysql 的 fork,具有越来越不同的功能,因此语法!您应该将您的开发环境与您的实时环境匹配到子版本级别!我认为 O. Jones 可能会对表/列名称的大小写敏感。您的确切选择语句是什么(请在您的问题中完全复制它)?您的开发和生产环境中的 lower_case_table_names 设置是什么?您的生产环境的确切版本是什么? 【参考方案1】:WHERE table_schema=<database-name> AND table_name=<table-name>;
如果这两个名称周围没有引号,并且名称中有标点符号或空格,则可能会出现多个错误中的任何一个。
不要简单地把名字贴进去;引用它们并转义某些字符。或者使用一些“绑定”技术。向我们展示构建字符串的实际 Python 代码和构建的 SQL 字符串。
【讨论】:
抱歉回复晚了。名称中没有空格,也没有需要转义的字符,但是,只是插入不带引号的值会导致问题。当我添加它们时,它再次起作用。我只是好奇它是如何与 MySQL 一起工作的,而不是与 MariaDB 一起工作的(插入不带引号的值)。谢谢!【参考方案2】:告诉你的服务器
SHOW VARIABLES LIKE 'lower_case_table_names';
如果您获得值0
,则您的表名区分大小写。 (1
表示不区分大小写)。请参阅a bit more explanation。
如果您的姓名区分大小写,您可能需要尝试使用此大小写进行查询。
SELECT COLUMN_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA=<database-name> AND TABLE_NAME=<table-name>;
请务必在您创建它们时使用<database-name>
和<table-name>
。
【讨论】:
运行该查询后我得到了值 0。但问题是表名和数据库名是正确的,但是查询返回错误说 COLUMN_NAME 不存在,而它确实存在。以上是关于无法从 information_schema (MySQL/MariaDB) 访问列名的主要内容,如果未能解决你的问题,请参考以下文章
SQL 访问控制错误:权限不足,无法对架构“INFORMATION_SCHEMA”进行操作