【发布时间】:2012-02-07 01:30:26
【问题描述】:
我刚刚为我的项目在 postgreSQL 中获得了一个数据库,并且刚刚意识到它采用 SQL_ASCII 编码,我认为这意味着“没有编码”。
那么将其转换为 utf8 的最简单方法是什么?而且我知道 db 应该是 latin1,转换会不会损坏内容?
谢谢!
【问题讨论】:
标签: database postgresql encoding utf-8
我刚刚为我的项目在 postgreSQL 中获得了一个数据库,并且刚刚意识到它采用 SQL_ASCII 编码,我认为这意味着“没有编码”。
那么将其转换为 utf8 的最简单方法是什么?而且我知道 db 应该是 latin1,转换会不会损坏内容?
谢谢!
【问题讨论】:
标签: database postgresql encoding utf-8
转换为 UTF8 不应损坏您的数据,因为(我相信)SQL_ASCII 中的所有字符也存在于 utf8 中;它们只是有不同的字节码。
您最好的选择是重建您的数据库。即转储它,创建一个 utf8 数据库,然后将转储恢复到该新数据库。
postgres pg_dump --encoding utf8 main -f main.sql
createdb -E utf8 newMain
psql -f main.sql -d newMain
一旦您对新的 UTF8 与您的数据匹配感到满意,您当然可以重命名数据库。
【讨论】:
我使用这些命令解决了;
1-) 导出
pg_dump --username=postgres --encoding=ISO88591 database -f database.sql
之后
2-) 导入
psql -U postgres -d database < database.sql
这些命令帮我解决了转换 SQL_ASCII - UTF-8 的问题
【讨论】:
UTF-8 转换是关于保存在非 UTF-8 数据库中的字符类型:根据数据,建议的解决方案可能会失败。 我设法按照tutorial 转换了我的,使用 recode(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
【讨论】:
client_encoding选项编辑为UTF8
我在整个互联网上搜索了这个问题的解决方案,上面的 Koyots 解决方案在浪费了无数小时尝试将旧的 SQL_ASCII 数据库迁移到新的 UTF8 数据库之后第一次起作用
扩展解决方案...
我建议将这两个数据库保留几周,直到您确定没有丢失任何数据(前提是您可以腾出磁盘空间)
【讨论】:
虽然这个问题很老了,但我想与一个脚本合作,在该脚本中可以迁移所有数据库或特定数据库,已经更改了这些数据库的“编码”和“本地化”,而无需创建一个物理文件。
#!/bin/bash
# Autor: Dennys Santos Sobrinho - 11.11.2021
# PostgreSQL
PG_HOME=/usr/local/pgsql_14.1
PG_DATA=/dados/database/pgsql
# Source Server
SERVER_1=10.7.0.221
PORT_1=5432
# Target Server
SERVER_2=10.7.0.222
PORT_2=5432
export PGPASSWORD='!$pgsql_1fsp2_snr$@'
# Dump all databases
#time $PG_HOME/bin/pg_dumpall --encoding=utf8 --no-sync --create --clean --if-exists -h $SERVER_1 -p $PORT_1 | sed -E $'s/LATIN1/UTF8/g; s/pt_BR.ISO-8859-1/pt_BR.UTF-8/g' | recode UTF-8 | psql -h $SERVER_2 -p $PORT_2 > /var/log/dumpAll.log 2>/dev/null
# Dump only specific database
time $PG_HOME/bin/pg_dump --encoding=utf8 --no-sync --create --clean --if-exists -h $SERVER_1 -p $PORT_1 --dbname=pg_sicp | sed -E $'s/LATIN1/UTF8/g; s/pt_BR.ISO-8859-1/pt_BR.UTF-8/g' | recode UTF-8 | psql -h $SERVER_2 -p $PORT_2 > /var/log/dumpOnly.log 2>/dev/null
【讨论】: