3

我们正在将 MySQL 迁移到 PostgreSQL。我可以轻松地审核整个 (REALbasic) 程序中使用的模式和 SQL 语句。大多数 SQL 是由构建字符串变量组成的。

我已经知道需要用SELECT LAST_INSERT_ID()具有 UNIQUE 约束的 SERIAL 列替换我们的使用。

两者之间在 SQL 语句中不明显可见的差异如果有的话)可能会咬我们?我正在寻找关于行为的(可能是微妙的)假设,例如自动提交中的任何差异,需要添加 MySQL 中没有的约束等。

我试图为几个在这两个数据库中都不是专家的相当聪明、细心的人梳理出任何问题。

这是一项单向承诺,因此如果有重大好处,我们将通过添加新声明获得重大好处,我会感谢他们指出。

注意:我们没有使用任何形式的参数化查询,是的,我已经指出注入攻击的问题是对代码的必需审计。

是的,出于好奇,这个决定是由 GPL 问题促成的,并不是我们反对为许可证付费,但不幸的是,MySQL 的唯一 REALbasic 驱动程序是 GPL。截至 2009 年 5 月,Real Software 发布了一个新的社区驱动程序,它是 GPL,并正确包含源代码。他们承诺在不久的将来推出非 GPL Enterprise 驱动程序。

我准备相信答案可能是床下没有看不见的怪物,但我想我会要求确定。

4

7 回答 7

6
  • select count(*) from table;

    会很慢,因为它需要读取整个表。如果您需要经常计算大表,则需要解决方法。这是确保多版本并发控制所必需的。

  • 在最新版本(8.3)中,没有隐式转换为文本,这意味着例如

    select 234 like '2%';

    会抛出错误。你需要明确的演员,如:

    select 234::text like '2%';

  • 更新实际上是删除+插入。由于已删除行使用的空间不会立即释放,因此如果您在一个事务中更新整个表,那么您将需要双倍的空间。

Postgresql 是一个非常好的数据库,你很快就会爱上它。它有几个非常有用的特性,你会在其他甚至是商业数据库中错过这些特性。例如事务数据定义语言或保存点。

于 2009-02-04T09:58:34.770 回答
3

http://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL

于 2009-01-14T13:37:34.647 回答
3

当我从 MySQL 迁移到 PostgreSQL 时,有几件事确实阻碍了我:

1) 写入 MySQL 数据库的代码被破坏,并且将数据库垃圾提供给具有外键的真实数据库会阻止。加入参照完整性后,准备好发现“意外”的垃圾数据。

2) MySQL 的字符串索引不区分大小写!如果您在用户名之类的东西上有一个主键,那么根据 MySQL,“Coryking”和“CORYKING”是相同的。在 PostgreSQL 上,它们是不同的。直到有人开始注册应该已经在数据库中的重复用户名,我才意识到这一点。

3) MySQL 喜欢自动将无意义的默认值添加到您指定为“NOT NULL”的列。例如,如果您指定 VARCHAR(255) NOT NULL,它将将该列定义转换为“VARCHAR(255) NOT NULL DEFAULT ''”。

4) PostgreSQL 喜欢大查询——MySQL 不喜欢。迁移改进数据库查询后,您将获得很多乐趣——也不要害羞。

于 2009-02-25T20:17:06.860 回答
1

除非您的列类型与 SQL92 兼容,否则您遇到两者之间类型名称的差异。

查询中的变量修改在 postgreSQL 中不起作用,例如,这将在 MySQL 中起作用,但在 postgreSQL 中不起作用(我最近没有测试过,也许现在可以了。)

SET @a:=1 SELECT ID,@a:=@a+1 FROM some_table;

我个人也认为 postgreSQL 可以更好地处理复杂的查询,包括子选择等(大多数 MySQL 用户过去常常避免)。

编辑:哦,我差点忘了!postgreSQL 存储表的方式与 MySQL 完全不同。这也可能会影响您的备份/恢复策略。

于 2009-01-14T07:27:23.957 回答
1

我不知道您是否使用 PHP,但我发现 addlashes 对 MySQL 的效果相对较好,但在 Postgres 中却很快。使用 pg_escape_string() 或更好的准备好的语句。

于 2009-05-14T22:58:59.023 回答
0

根据所涉及的查询数量(如果您有内部人员这样做),提取所有查询,根据需要调整它们并在现有数据库的两个副本上运行它们可能是明智之举,一个正在运行 mysql,一个正在运行后格雷斯尔。查看生成的日志并比较结果数据可能会显示一些有趣的提示。第一步也可以通过执行单元测试、手动或基于脚本的应用程序测试来完成。

于 2009-01-13T23:35:38.747 回答
0

基于WikiVS 比较,我发现了一些有趣的点,大多数不是真正的问题,例如: - Postgres 中的子查询要快得多,这并不是真正的问题,但意味着可以删除一些解决方法

该站点确实将我带到了Postgres Gotchas列表,其中包含有关 count(*) 速度和另一个顺序扫描问题的更多详细信息:Max 和 Min 是顺序扫描。与迄今为止发现的任何其他事情相比,这更有可能损害我们的绩效。但是,该文章包含 Max(col) 解决方法:

SELECT col FROM table ORDER BY col DESC LIMIT 1
于 2009-02-08T04:45:13.073 回答