首页 > 解决方案 > PHP中是否有“PostgreSQL-SQL-to-OtherDB-SQL”转换器之类的东西,或者根本没有?

问题描述

我专门使用 PostgreSQL。我没有计划改变这一点。但是,我认识到其他人不是我,而是使用 MySQL、MS SQL、IBM SQL、SQLite SQL、Oracle SQL 和 ManyOthers SQL。我知道他们在现实中有不同的名字。

我的查询如下所示:

SELECT * FROM table WHERE id = $1;
UPDATE table SET col = $1 WHERE col = $2;
INSERT INTO table (a, b, c) VALUES ($1, $2, $3);

我的数据库包装函数目前仅支持 PostgreSQL,通过内部调用pg_*函数。

我也希望支持“其他数据库”。这将涉及(微不足道的部分)使我的包装函数能够通过使用 PHP 函数与其他数据库进行交互。

困难的部分是将来自应用程序的 PostgreSQL 风格的 SQL 查询重构为工作方式相同但将被正在使用的其他 SQL 数据库(例如 MySQL)理解的东西。这显然涉及到最终查询字符串的高度高级解析、分析和最终创建。例如,这个 PostgreSQL SQL 查询:

SELECT * FROM table WHERE col ILIKE $1 ORDER BY random() LIMIT 1;

...将变成这样的WeirdSQL:

SELECT * FROM table WHERE col ISEQUALTOKINDA %1 ORDER BY rnd() LIMIT 1;

除了 PostgreSQL,我不需要任何其他输入 SQL 风格的支持,但输出必须是“所有大型 SQL 数据库供应商”。

有没有人尝试过这个?或者它是永远不会作为免费软件出现但可能作为商业产品存在的东西?听起来这将是一件事。这将非常有用,并且已经尝试了“更疯狂”的项目。

标签: postgresql

解决方案


ODBC 在数据库语法之上使用自己的语法。需要 ODBC 驱动程序将 ODBC 参数标记 ( ) 转换为数据库使用的任何内容,并为在 DB 中可能具有非标准语法的某些元素?转换转义序列(时间/GUID/间隔文字、LIKE 转义字符、外连接、过程调用、函数调用)。

但是,大多数转义序列都是可选的,这对其他语法差异没有帮助,例如LIMIT 1.

ODBC 驱动程序提供了有关 SQL 语法详细信息的一长串信息,但构建符合这些限制的查询是应用程序的工作,并非所有差异都可以通过此列表描述。在实践中,大多数 ODBC 应用程序将自己限制为通常支持的 SQL 子集。


推荐阅读