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

기본 문자 집합 SQL_ASCII로 설정된 데이터베이스가 있습니다. UNICODE로 바꾸고 싶어요. 그렇게하는 쉬운 방법이 있습니까?



답변

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

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

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

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


답변

먼저 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 문자를 포함하는 인덱스를 다시 빌드해야 할 것입니다.

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


답변

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

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

그리고 이것은 :
일부 로케일 범주는 데이터베이스가 생성 될 때 고정 된 값을 가져야합니다. 데이터베이스마다 다른 설정을 사용할 수 있지만 일단 데이터베이스가 생성되면 해당 데이터베이스에 대해 더 이상 변경할 수 없습니다. 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 (문자열 정렬 순서)를 사용하여 새 데이터베이스가 자동으로 생성됩니다.


답변

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

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

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

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


답변

# 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"


답변