У меня есть база данных, которая была настроена с набором символов по умолчанию SQL_ASCII. Я хочу переключить его на UNICODE. Есть простой способ сделать это?
У меня есть база данных, которая была настроена с набором символов по умолчанию SQL_ASCII. Я хочу переключить его на UNICODE. Есть простой способ сделать это?
Ответы:
Чтобы изменить кодировку вашей базы данных:
Убедитесь, что при этом правильно установлена клиентская кодировка.
Источник: http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php
sudo -u postgres pg_dump your_db > /backups/postgresql.sql
...
Во-первых, ответ Даниэля - правильный и безопасный вариант.
Для конкретного случая перехода с SQL_ASCII на что-то другое, вы можете обмануть и просто ткнуть каталог pg_database, чтобы переназначить кодировку базы данных. Это предполагает, что вы уже сохранили любые символы, отличные от ASCII, в ожидаемой кодировке (или что вы просто не использовали символы, отличные от ASCII).
Тогда вы сможете:
update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb'
Это не изменит параметры сортировки базы данных, а только то, как закодированные байты преобразуются в символы (поэтому теперь length('£123')
будет возвращено 4 вместо 5). Если в базе данных используется сопоставление «C», не должно быть изменений в порядке строк ASCII. Однако вам, вероятно, придется перестроить все индексы, содержащие символы, отличные от ASCII.
Пусть покупатель будет бдителен. Выгрузка и перезагрузка позволяют проверить, действительно ли содержимое вашей базы данных соответствует ожидаемой кодировке, а это не так. И если окажется, что у вас в базе есть некорректно закодированные данные, спасти их будет сложно. Так что, если возможно, сделайте дамп и повторно инициализируйте.
-bash: syntax error near unexpected token
(''
psql
строке.
Сброс базы данных с определенной кодировкой и попытка восстановить ее в другой базе данных с другой кодировкой может привести к повреждению данных. Кодировка данных должна быть установлена ДО того, как какие-либо данные будут вставлены в базу данных.
Проверьте это : при копировании любой другой базы данных нельзя изменить настройки кодировки и локали по сравнению с исходной базой данных, так как это может привести к повреждению данных.
И это : некоторые категории локали должны иметь фиксированные значения при создании базы данных. Вы можете использовать разные настройки для разных баз данных, но после создания базы данных вы больше не можете изменять их для этой базы данных. LC_COLLATE и LC_CTYPE - эти категории. Они влияют на порядок сортировки индексов, поэтому они должны оставаться фиксированными, иначе индексы в текстовых столбцах будут повреждены. ( Но вы можете ослабить это ограничение, используя параметры сортировки, как описано в Разделе 22.2. ) Значения по умолчанию для этих категорий определяются при запуске initdb, и эти значения используются при создании новых баз данных, если иное не указано в команде CREATE DATABASE.
Я бы предпочел перестроить все с самого начала должным образом с правильной локальной кодировкой в вашей ОС Debian, как описано здесь :
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 (порядок сортировки строк).
Ответ Даниэля Кутика правильный, но он может быть еще безопаснее с переименованием базы данных .
Итак, действительно безопасный способ:
В экстренных случаях просто переименуйте БД обратно
# 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"