2012-01-10 328 views
8

我刚刚在我的项目中得到了postgreSQL中的数据库,并且意识到它使用了SQL_ASCII编码,这意味着我认为“无编码”。如何将postgreSQL中的数据库转换为utf8?

那么将此转换为utf8的最简单方法是什么?我知道db应该是latin1,转换是否会损坏内容?

谢谢!

回答

9

转换为UTF8不会损坏您的数据,因为我相信没有不会转换的字符。

最好的办法是重新构建数据库,即转储它,创建一个utf8数据库,然后将转储恢复到该新数据库。

postgres pg_dump --encoding utf8 main -f main.sql 
createdb -E utf8 newMain 
psql -f main.sql -d newMain 

一旦你高兴的是,新的UTF8一个您的数据相匹配,您可以的话当然重命名数据库。

+1

我试过但最后一步,当我在SQL文件中转储时,它告诉我“psql:lo17_utf8.sql:6615:错误:编码为”UTF8“的无效字节序列:0xe96365” – darkjh 2012-01-10 21:56:25

+1

它似乎是stange,我告诉pg_dump用utf8转储数据库,但是当我使用file命令检查它时,它告诉我转储是在latin1中。 – darkjh 2012-01-10 22:24:28

+1

现在好了,谢谢。 – darkjh 2012-01-10 22:25:27

1

我使用这些命令解决了问题;

1-)导出

pg_dump --username=postgres --encoding=ISO88591 database -f database.sql 

2-之后)导入

psql -U postgres -d database < database.sql 

这些命令帮我解决转换SQL_ASCII的问题 - UTF-8

2

UTF-8转换完全是关于保存在非UTF-8数据库中的字符类型:取决于提出的解决方案的数据可能会失败。 我设法转换矿井下面这个tutorial,使用重新编码(从GNU项目,让你改变即时给定文件的编码一个小工具),我想出了这个:

pg_dump -v --encoding utf8 -Fc -Z9 -c -f origindb.sql.bin iso8859-1-db 

pg_restore origindb.sql.bin | recode iso-8859-1..u8 | psql --dbname utf8converteddb 
0

我上面搜索整个互联网寻找解决这一问题,并Koyots解决方案工作第一次浪费了无数个小时乱投医老SQL_ASCII数据库迁移到新的UTF8数据库

要在解决扩大后...

  • 我第一次重定向所有的网站维护页面
  • 更名数据库通过附加“_ascii”它的名字只是为了确保没有什么可以连接到它,也让我知道后说,这是原始数据库!
  • 创建与附加到名称 “_utf8” 的新的UTF8数据库(附加TEMPLATE = template0中到CREATE DATABASE语句)
  • 备份的ASCII数据库
  • 恢复的备份到新的UTF8数据库
  • 更名utf8数据库返回到我之前命名的内容
  • 检查数据库总大小与原始数据库的大小大致相同。由于死元组等原因不能完全匹配。新的数据库应该根据填充因子等而变小。
  • 关闭网站重定向
  • 测试网站

我建议保留这两个数据库的几个星期,直到你确信你没有任何数据丢失(只要你能腾出磁盘空间)

相关问题