Varsayılan karakter kümesi SQL_ASCII ile kurulmuş bir veritabanım var. UNICODE olarak değiştirmek istiyorum. Bunu yapmanın kolay bir yolu var mı?
Varsayılan karakter kümesi SQL_ASCII ile kurulmuş bir veritabanım var. UNICODE olarak değiştirmek istiyorum. Bunu yapmanın kolay bir yolu var mı?
Yanıtlar:
Veritabanınızın kodlamasını değiştirmek için:
Tüm bunlar sırasında istemci kodlamasının doğru ayarlandığından emin olun.
Kaynak: http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php
sudo -u postgres pg_dump your_db > /backups/postgresql.sql
...
Öncelikle Daniel'in cevabı doğru ve güvenli seçenektir.
SQL_ASCII'den başka bir şeye geçişin özel durumu için, hile yapabilir ve veritabanı kodlamasını yeniden atamak için pg_database kataloğunu dürtebilirsiniz. Bu, beklenen kodlamada ASCII olmayan karakterleri zaten depoladığınızı (veya hiçbir ASCII olmayan karakter kullanmadığınızı) varsayar.
O zaman şunları yapabilirsiniz:
update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb'
Bu, veritabanının harmanlamasını değiştirmeyecek, kodlanmış baytların karakterlere nasıl dönüştürüldüğünü değiştirmeyecek (bu nedenle şimdi length('£123')
5 yerine 4 döndürecektir). Veritabanı 'C' harmanlamasını kullanıyorsa, ASCII dizeleri için sıralamada herhangi bir değişiklik olmamalıdır. Yine de, ASCII olmayan karakterler içeren herhangi bir dizini yeniden oluşturmanız gerekecektir.
Uyarı imparatoru. Damping ve yeniden yükleme, veritabanı içeriğinizin aslında beklediğiniz kodlamada olup olmadığını kontrol etmenin bir yolunu sağlar ve bu olmaz. Ve eğer veritabanında bazı yanlış kodlanmış verileriniz olduğu ortaya çıkarsa, kurtarmak zor olacaktır. Yani eğer yapabilirseniz, boşaltın ve yeniden başlatın.
-bash: syntax error near unexpected token
(''
psql
komut isteminde yapıştırılması gerekiyor .
Bir veritabanının belirli bir kodlamayla dökümünü alıp başka bir veritabanında farklı bir kodlamayla geri yüklemeyi denemek, verilerin bozulmasına neden olabilir. Veri kodlaması, veri tabanına herhangi bir veri girilmeden ÖNCE ayarlanmalıdır.
Kontrol bu : o bozuk verilere yol olabilir çünkü başka bir veritabanı kopyalarken, kodlama ve yerel ayarları, kaynak veritabanının olanlardan değiştirilemez.
Ve bu : Bazı yerel kategorilerin, veritabanı oluşturulduğunda değerlerinin sabitlenmiş olması gerekir. Farklı veritabanları için farklı ayarlar kullanabilirsiniz, ancak bir veritabanı oluşturulduktan sonra bunları artık o veritabanı için değiştiremezsiniz. LC_COLLATE ve LC_CTYPE bu kategorilerdir. Dizinlerin sıralama düzenini etkilerler, bu nedenle sabit tutulmaları gerekir, aksi takdirde metin sütunlarındaki dizinler bozulabilir. ( Ancak, Bölüm 22.2'de tartışıldığı gibi bu kısıtlamayı harmanlamaları kullanarak hafifletebilirsiniz. ) Bu kategoriler için varsayılan değerler, initdb çalıştırıldığında belirlenir ve bu değerler, CREATE DATABASE komutunda aksi belirtilmedikçe, yeni veritabanları oluşturulduğunda kullanılır.
Debian işletim sisteminizde doğru bir yerel kodlama ile baştan itibaren her şeyi burada açıklandığı gibi yeniden inşa etmeyi tercih ederim :
su root
Yerel ayarlarınızı yeniden yapılandırın:
dpkg-reconfigure locales
Yerel ayarınızı seçin (örneğin İsviçre'de Fransızca için: fr_CH.UTF8)
Postgresql'i düzgün bir şekilde kaldırın ve temizleyin:
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'i yeniden yükleyin:
aptitude install postgresql-9.1 postgresql-contrib-9.1 postgresql-doc-9.1
Artık herhangi bir yeni veritabanı doğru kodlama, LC_TYPE (karakter sınıflandırması) ve LC_COLLATE (dize sıralama düzeni) ile otomatik olarak oluşturulacaktır.
Daniel Kutik'in cevabı doğru, ancak veritabanının yeniden adlandırılmasıyla daha da güvenli olabilir .
Yani, gerçekten güvenli yol şudur:
Acil durumda, DB'leri yeniden adlandırmanız yeterli
# 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"