1

我现在工作的项目是在 Zend 框架中将数据库从 mysql 升级到 postgreSQL。我已经通过“ESF 数据库迁移工具包”将数据库迁移到 PostgreSQL。像“Emp_FirstName”、“Emp_LastName”等字段名称如何在 PostgreSQL 中存储为“emp_firstname”和“emp_lastname”。这导致代码中的错误。但是,当我将 PostgreSQL 中的文件更新为 Emp_FirstName 时,它​​显示错误

********** Error **********

ERROR: column "Emp_FirstName" does not exist
SQL state: 42703
Character: 8

是否可以像在 MYSQL 中一样给出文件名?

4

1 回答 1

1

迁移工具不是“双引号”标识符,因此它们的大小写被 PostgreSQL 扁平化为小写。您的代码必须引用标识符,以便它们保留大小写。PostgreSQL 区分大小写,并且将不带引号的标识符扁平化,而MySQL 在 Windows 和 Mac 上不区分大小写,在 *nix 上区分大小写

有关PostgreSQL 行为的详细信息,请参阅PostgreSQL 手册中有关标识符和关键字的部分。无论如何,您可能应该阅读它,以便您了解字符串引用的工作原理。

您需要选择以下选项之一:

  • 将代码更改为不引用标识符;
  • 在创建模式时将迁移工具更改为引用标识符;
  • 手动迁移架构而不是使用迁移工具;
  • 修复手动工具生成的SQL中标识符的引用;或者
  • 小写所有标识符,因此对 Pg 无关紧要

当您添加 Oracle 支持并发现 Oracle将所有标识符大写时,最后一个选项对您没有帮助,因此我建议选择前四个选项之一。我没有找到让迁移工具在 30 秒的 Google 快速搜索中引用标识符的方法,但没有花太多时间在上面。我会首先在迁移工具中寻找控制引用模式的选项。

PostgreSQL 没有配置选项来始终将标识符视为引号或使用不区分大小写的标识符比较。

这远不是您将遇到的唯一不兼容问题,因此请准备好更改查询和应用程序代码。在某些情况下,如果您计划继续支持 MySQL,您甚至可能需要一个查询 MySQL 和另一个查询 PostgreSQL。

如果您没有在 MySQL 中使用sql_mode = ANSI和使用STRICT模式,那么与使用这些选项相比,移植时会遇到更多麻烦,因为这两个选项都使 MySQL 更接近 SQL 标准行为。

于 2013-03-19T11:03:03.550 回答