从最近几天起,我一直在尝试将MySQL数据库迁移到PotsgreSQL,但是有一个问题不能让我成功:有点专栏。
我尝试过不同的方法:首先我尝试使用pgloader,因为它看起来最简单,但我不知道如何为此编写脚本,所以我从网上做了一个例子:
load database
from mysql://dbu1:password@localhost/openbill
into postgresql://dbu1:password2@localhost/openbill
WITH include drop, create tables, no truncate,
create indexes, reset sequences, foreign keys
SET maintenance_work_mem to '128MB', work_mem to '12MB', search_path to 'openbill'
CAST type datetime to timestamptz
drop default drop not null using zero-dates-to-null,
type date drop not null drop default using zero-dates-to-null
-- Create the database in postgresql to import into. If your db already exist this can be skipped
BEFORE LOAD DO
$$ create schema if not exists openbill; $$
;
这个问题,是最后一行,我不知道如何更改openbill,并给了我错误,所以我试着删除它,但当然,因为它没有为导入创建了表。
经过很多麻烦之后,我尝试使用转储,为此,我认为有必要将sintaxis更改为与postgresql兼容,所以我找到了这样做的代码:https://github.com/lanyrd/mysql-postgresql-converter但是某种原因,当它到达带有位列的第一个表时会失败,更确切地说,不是在创建它时,而是在插入数据时,因为出于某种原因,这个位看起来像在sql上,它给了我错误
ERROR: invalid byte sequence for encoding "UTF8": 0x00
我用:
生成了转储mysqldump -h ip -u root -p --compatible=postgresql --default-character-set=utf8 database > database.sql
有谁知道如何解决这个问题?或者,如果有更好的方法进行迁移?
答案 0 :(得分:0)
您应该将MySQL的bit
类型转换为PostgreSQL的bit varying
类型。
在MySQL中选择bit
值时,它们默认显示为字符串(!),这可能会导致您看到错误消息:
root@lau56> SELECT id, val FROM bittest;
+----+-----+
| id | val |
+----+-----+
| 1 | ▒ |
| 2 | ▒ |
+----+-----+
2 rows in set (0.00 sec)
您可以使用bin
函数以二进制表示法显示它们:
root@lau56> SELECT id, bin(val) FROM bittest;
+----+------------+
| id | bin(val) |
+----+------------+
| 1 | 1111111111 |
| 2 | 10101010 |
+----+------------+
2 rows in set (0.00 sec)
这将为PostgreSQL的bit varying
数据类型生成有效输入。
答案 1 :(得分:0)
好吧,经过一些帮助,我找到了解决这个问题的方法。主要的问题是@Laurenz说的,它返回字符串而不是位,所以我使用了--hex-blob选项,并使用十六进制格式0x00而不是字符串生成转储。这有帮助,因为我没有看到很多正方形,而是能够看到十六进制,所以我使用了崇高的文本,选择了所有的0x00,并将其更改为各自的B'0',然后它没有问题。
这是我最后的转储字符串:
mysqldump -h ip -u root -p --compatible=postgresql --hex-blob --default-character-set=utf8 database > database.sql