postgres 데이터베이스의 문자 인코딩을 어떻게 변경합니까?


답변:


64

데이터베이스의 인코딩을 변경하려면 :

  1. 데이터베이스 덤프
  2. 데이터베이스를 삭제하고
  3. 다른 인코딩으로 새 데이터베이스 만들기
  4. 데이터를 다시로드하십시오.

이 모든 과정에서 클라이언트 인코딩이 올바르게 설정되었는지 확인하십시오.

출처 : http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php


링크에서 얻을 수없는 것은 "첫 번째 단계에서 생성 된 덤프 파일에 특수 문자가 있는지 확인하고 필요한 변경을 수행합니다."=> 모든 특수 문자를 수동으로 변경해야
합니까

1
답변에 덤프 및 다시 가져 오기 명령을 추가 할 수 있습니까? 같은 sudo -u postgres pg_dump your_db > /backups/postgresql.sql...
rubo77

104

먼저 Daniel의 대답은 정확하고 안전한 선택입니다.

SQL_ASCII에서 다른 것으로 변경하는 특정 사례의 경우 pg_database 카탈로그를 속이고 간단히 찔러 데이터베이스 인코딩을 재 할당 할 수 있습니다. 이는 예상되는 인코딩으로 ASCII가 아닌 문자를 이미 저장했다고 가정하거나 단순히 ASCII가 아닌 문자를 사용하지 않았다고 가정합니다.

그런 다음 다음을 수행 할 수 있습니다.

update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb'

이것은 데이터베이스의 데이터 정렬을 변경하지 않고 인코딩 된 바이트가 문자로 변환되는 방식 만 변경합니다 (이제 length('£123')5 대신 4를 반환합니다). 데이터베이스가 'C'데이터 정렬을 사용하는 경우 ASCII 문자열의 순서가 변경되지 않아야합니다. 하지만 비 ASCII 문자를 포함하는 인덱스를 다시 빌드해야 할 것입니다.

주의 사항. 덤프 및 다시로드는 데이터베이스 콘텐츠가 실제로 예상 한 인코딩으로되어 있는지 확인하는 방법을 제공하며 그렇지 않습니다. 그리고 데이터베이스에 잘못 인코딩 된 데이터가있는 것으로 밝혀지면 구조가 어려울 것입니다. 따라서 가능하다면 덤프하고 다시 초기화하십시오.


1
+1 감사합니다. 내 개발 컴퓨터는 UTF8 인코딩을 사용하지만 프로덕션에서는 LATIN1을 사용합니다. 이 때문에 많은 오류가 발생했습니다.
Luiz Damim 2011

1
그것은 나에게이 오류를주고있다 : -bash: syntax error near unexpected token ( '`
Abhipso 고쉬

@AbhipsoGhosh 이것은 bash 셸에 붙여 넣어서는 안되지만 psql프롬프트에 있습니다.
Pierre

14

특정 인코딩으로 데이터베이스를 덤프하고 다른 인코딩으로 다른 데이터베이스에서 복원하려고하면 데이터가 손상 될 수 있습니다. 데이터 인코딩은 데이터가 데이터베이스에 삽입되기 전에 설정되어야합니다.

확인 : 그 데이터가 손상 될 수 있기 때문에 다른 데이터베이스를 복사하는 경우, 인코딩 및 로케일 설정은 소스 데이터베이스와는 변경할 수 없습니다.

그리고 이것은 : 일부 로케일 범주는 데이터베이스가 생성 될 때 고정 된 값을 가져야합니다. 데이터베이스마다 다른 설정을 사용할 수 있지만 일단 데이터베이스가 생성되면 해당 데이터베이스에 대해 더 이상 변경할 수 없습니다. LC_COLLATE 및 LC_CTYPE은 이러한 범주입니다. 인덱스 정렬 순서에 영향을 미치므로 고정 된 상태로 유지해야합니다. 그렇지 않으면 텍스트 열의 인덱스가 손상됩니다. ( 그러나 섹션 22.2에서 논의한 바와 같이 데이터 정렬을 사용하여이 제한을 완화 할 수 있습니다. ) 이러한 범주의 기본값은 initdb가 실행될 때 결정되며 해당 값은 CREATE DATABASE 명령에서 달리 지정되지 않는 한 새 데이터베이스가 생성 될 때 사용됩니다.


여기에 설명 된대로 데비안 OS에서 올바른 로컬 인코딩을 사용하여 처음부터 모든 것을 올바르게 다시 빌드하는 것이 좋습니다 .

su root

로컬 설정 재구성 :

dpkg-reconfigure locales

로케일을 선택하십시오 (예 : 스위스의 프랑스어 : fr_CH.UTF8).

postgresql을 올바르게 제거하고 정리하십시오.

apt-get --purge remove postgresql\*
rm -r /etc/postgresql/
rm -r /etc/postgresql-common/
rm -r /var/lib/postgresql/
userdel -r postgres
groupdel postgres

postgresql 다시 설치 :

aptitude install postgresql-9.1 postgresql-contrib-9.1 postgresql-doc-9.1

이제 올바른 인코딩, LC_TYPE (문자 분류) 및 LC_COLLATE (문자열 정렬 순서)를 사용하여 새 데이터베이스가 자동으로 생성됩니다.


2
"dpkg-reconfigure locales", 복수라고 생각합니다. 단수형이 작동하지 않는 것 같습니다 (방금 확인).
foo

9

Daniel Kutik의 대답은 정확하지만 데이터베이스 이름을 변경 하면 훨씬 더 안전 할 수 있습니다 .

따라서 진정으로 안전한 방법은 다음과 같습니다.

  1. 다른 인코딩 및 이름으로 새 데이터베이스 만들기
  2. 데이터베이스 덤프
  3. 새 DB로 덤프 복원
  4. 새 DB로 애플리케이션이 올바르게 실행되는지 테스트
  5. 오래된 DB를 의미있는 이름으로 변경
  6. 새 DB 이름 바꾸기
  7. 응용 프로그램을 다시 테스트하십시오.
  8. 이전 데이터베이스 삭제

비상시에는 DB의 이름을 다시 변경하십시오.


7
# dump into file
pg_dump myDB > /tmp/myDB.sql

# create an empty db with the right encoding (on older versions the escaped single quotes are needed!)
psql -c 'CREATE DATABASE "tempDB" WITH OWNER = "myself" LC_COLLATE = '\''de_DE.utf8'\'' TEMPLATE template0;'

# import in the new DB
psql -d tempDB -1 -f /tmp/myDB.sql

# rename databases
psql -c 'ALTER DATABASE "myDB" RENAME TO "myDB_wrong_encoding";' 
psql -c 'ALTER DATABASE "tempDB" RENAME TO "myDB";'

# see the result
psql myDB -c "SHOW LC_COLLATE"   
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.