【问题标题】:How to convert a db in postgreSQL to utf8?如何将 postgreSQL 中的数据库转换为 utf8?
【发布时间】:2012-02-07 01:30:26
【问题描述】:

我刚刚为我的项目在 postgreSQL 中获得了一个数据库,并且刚刚意识到它采用 SQL_ASCII 编码,我认为这意味着“没有编码”。

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

谢谢!

【问题讨论】:

    标签: database postgresql encoding utf-8


    【解决方案1】:

    转换为 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 与您的数据匹配感到满意,您当然可以重命名数据库。

    【讨论】:

    • 我试过了,但是最后一步,当我转储到 sql 文件时,它告诉我“psql:lo17_utf8.sql:6615: ERROR: invalid byte sequence for encoding "UTF8": 0xe96365”
    • 看起来很奇怪,我告诉 pg_dump 用 utf8 转储数据库,但是当我使用 file 命令检查它时,它显示转储是 latin1。
    【解决方案2】:

    我使用这些命令解决了;

    1-) 导出

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

    之后

    2-) 导入

    psql -U postgres -d database < database.sql
    

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

    【讨论】:

      【解决方案3】:

      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
      【解决方案4】:

      我在整个互联网上搜索了这个问题的解决方案,上面的 Koyots 解决方案在浪费了无数小时尝试将旧的 SQL_ASCII 数据库迁移到新的 UTF8 数据库之后第一次起作用

      扩展解决方案...

      • 我首先将所有网站重定向到维护页面
      • 通过将“_ascii”附加到它的名称来重命名数据库,以确保没有任何东西可以连接到它,所以我知道这是原来的数据库!
      • 创建了一个新的 utf8 数据库,并在名称后附加了“_utf8”(将 TEMPLATE=t​​emplate0 附加到 CREATE DATABASE STATEMENT)
      • 备份了 ascii 数据库
      • 已将备份恢复到新的 utf8 数据库
      • 将 utf8 数据库重命名为我之前的名称
      • 检查数据库总大小与原始数据库的大小大致相同。由于死元组等原因,不会完全匹配。根据填充因子等,新数据库应该更小。
      • 关闭网站重定向
      • 测试所有网站

      我建议将这两个数据库保留几周,直到您确定没有丢失任何数据(前提是您可以腾出磁盘空间)

      【讨论】:

        【解决方案5】:

        虽然这个问题很老了,但我想与一个脚本合作,在该脚本中可以迁移所有数据库或特定数据库,已经更改了这些数据库的“编码”和“本地化”,而无需创建一个物理文件。

        #!/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
        

        enter image description here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-11-12
          • 1970-01-01
          • 1970-01-01
          • 2012-08-05
          • 2010-09-11
          • 1970-01-01
          • 2016-07-13
          • 2013-06-06
          相关资源
          最近更新 更多