2011-02-08 32 views
7

Tôi gặp sự cố khi thiết lập và chạy một cơ sở dữ liệu cụ thể. Tôi đang cố gắng để khôi phục một dump postgreSQL tôi nhận được từ người khác. Tôi đã thử một vài phương pháp không có kết quả.Định cấu hình Locales trên Linux cho PostgreSQL

  1. Trực tiếp từ pg_restore

    pg_restore -C -d postgres --exit-on-error maggie_prod_20111221.dump.sql

  2. Tạo cơ sở dữ liệu và bảng đầu tiên

    createdb -T template0 maggieprod -E LATIN1

    SQL: CREATE TABLESPACE magdat OWNER maggie LOCATION '/somewhere/magdat';

    pg_restore -v -d template1 maggie_prod_20110121.dump.sql

Sử dụng phương pháp đầu tiên tôi nhận được như sau:

pg_restore: [archiver (db)] Error while PROCESSING TOC:

pg_restore: [archiver (db)] Error from TOC entry 2308; 1262 16386 DATABASE maggieprod postgres

pg_restore: [archiver (db)] could not execute query: ERROR: encoding LATIN1 does not match locale en_CA.utf8

DETAIL: The chosen LC_CTYPE setting requires encoding UTF8. Command was: CREATE DATABASE maggieprod WITH TEMPLATE = template0 ENCODING = 'LATIN1' TABLESPACE = magdat;

Một d bằng cách sử dụng thứ hai, khi tôi cố gắng và tạo ra các cơ sở dữ liệu tôi nhận được:

createdb: database creation failed: ERROR: encoding LATIN1 does not match locale en_CA.utf8

DETAIL: The chosen LC_CTYPE setting requires encoding UTF8.

Vì vậy, nó có vẻ là tôi không thể tạo ra một cơ sở dữ liệu mã hóa latin1? Tại sao vậy? Tôi mới dùng ngôn ngữ và mã hóa và không biết nhiều về chúng. Tôi chỉ biết rằng bãi chứa được tạo ra từ một cơ sở dữ liệu LATIN1.

Kết quả của locale là:

LANG=en_CA.utf8 LC_CTYPE="en_CA.utf8" LC_NUMERIC="en_CA.utf8" LC_TIME="en_CA.utf8" LC_COLLATE="en_CA.utf8" LC_MONETARY="en_CA.utf8" LC_MESSAGES="en_CA.utf8" LC_PAPER="en_CA.utf8" LC_NAME="en_CA.utf8" LC_ADDRESS="en_CA.utf8" LC_TELEPHONE="en_CA.utf8" LC_MEASUREMENT="en_CA.utf8" LC_IDENTIFICATION="en_CA.utf8" LC_ALL=

Và đầu ra của locale -a là:

C en_AG en_AG.utf8 en_AU.utf8 en_BW.utf8 en_CA.utf8 en_DK.utf8 en_GB.utf8 en_HK.utf8 en_IE.utf8 en_IN en_IN.utf8 en_NG en_NG.utf8 en_NZ.utf8 en_PH.utf8 en_SG.utf8 en_US.utf8 en_ZA.utf8 en_ZW.utf8 POSIX

Tôi không thấy latin1 trong lệnh thứ hai, phải làm thế? Nếu vậy, làm thế nào tôi sẽ đi về việc thêm nó? Có đúng cho tôi giả định rằng tôi cần thay đổi ngôn ngữ trên máy tính của mình không? Nếu vậy, có cách nào để làm điều đó chỉ cho postgreSQL? Ngoài ra, khi tôi thử và mở bãi chứa, tôi thấy rất nhiều ký tự rác, tôi giả sử điều này là do mã hóa, làm thế nào tôi sẽ xem xét nó đúng cách?

Cảm ơn bạn đã được trợ giúp.

Trả lời

6

Bạn cần phải tạo cơ sở dữ liệu với ngôn ngữ phù hợp với mã hóa, ví dụ,

createdb -T template0 maggieprod -E LATIN1 --locale=en_CA 

Vì bạn không có tất cả miền địa phương được cài đặt, tôi đoán bạn đang sử dụng Debian hoặc Ubuntu. Trong trường hợp đó, hãy gọi dpkg-reconfigure locales hoặc cài đặt gói locales-all.

Cách khác, tạo cơ sở dữ liệu với mã hóa UTF8. Miễn là tất cả các khách hàng của bạn đặt mã hóa máy khách một cách chính xác, nó sẽ không tạo ra sự khác biệt.

1

tôi đã cố khi sử dụng cú pháp createdb từ The_Denominater, vì vậy tôi đã làm nó theo cách sau:

CREATE DATABASE maggieprod WITH ENCODING = 'LATIN1' 
    LC_CTYPE = 'en_CA' LC_COLLATE = 'en_CA' 
    TEMPLATE template0; 
0

Nếu bạn vẫn còn quan tâm đến cách sử dụng lệnh recode sẽ biến đổi bãi cơ sở dữ liệu của bạn với bộ ký tự của sự lựa chọn của bạn trước khi bạn nhập nó vào cơ sở dữ liệu mới của mình. Xem liên kết này - http://blog.e-shell.org/134

Các vấn đề liên quan