मेरे पास एक डेटाबेस है जो डिफ़ॉल्ट वर्ण सेट SQL_ASCII के साथ सेट किया गया था। मैं इसे UNICODE में बदलना चाहता हूं। क्या ऐसा करने का एक आसान तरीका है?
मेरे पास एक डेटाबेस है जो डिफ़ॉल्ट वर्ण सेट SQL_ASCII के साथ सेट किया गया था। मैं इसे UNICODE में बदलना चाहता हूं। क्या ऐसा करने का एक आसान तरीका है?
जवाबों:
अपने डेटाबेस के एन्कोडिंग को बदलने के लिए:
सुनिश्चित करें कि क्लाइंट एन्कोडिंग इस सब के दौरान सही ढंग से सेट है।
स्रोत: http://archives.postgresql.org/pgsql-novice/2006-03/msg00210210.p
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')5 के बजाय 4 वापस आ जाएगा)। यदि डेटाबेस 'C' कॉलेशन का उपयोग करता है, तो ASCII स्ट्रिंग्स के लिए ऑर्डर करने के लिए कोई बदलाव नहीं होना चाहिए। हालांकि आपको गैर-एएससीआईआई अक्षरों वाले किसी भी सूचकांक के पुनर्निर्माण की संभावना होगी।
कैवियट खाली करनेवाला। डंपिंग और पुनः लोड करना आपके डेटाबेस की सामग्री की जांच करने का एक तरीका प्रदान करता है जो वास्तव में आपके द्वारा अपेक्षित एन्कोडिंग में है, और यह नहीं करता है। और अगर यह पता चला है कि आपके पास डेटाबेस में कुछ गलत तरीके से एन्कोडेड डेटा था, तो बचाव करना मुश्किल होने वाला है। तो अगर आप संभवतः, डंप और पुनर्निवेश कर सकते हैं।
-bash: syntax error near unexpected token (
psqlप्रॉम्प्ट पर।
एक विशिष्ट एन्कोडिंग के साथ एक डेटाबेस को डंप करना और एक अन्य डेटाबेस पर एक अलग एन्कोडिंग के साथ इसे पुनर्स्थापित करने का प्रयास करना डेटा भ्रष्टाचार का परिणाम हो सकता है। डेटा एन्कोडिंग को किसी भी डेटा को डेटाबेस में डाला जाना चाहिए।
चेक इस : जब किसी अन्य डेटाबेस को कॉपी, एन्कोडिंग और स्थान सेटिंग्स, स्रोत डेटाबेस के उन लोगों से बदला नहीं जा सकता, क्योंकि वह भ्रष्ट डेटा हो सकती है।
और यह : कुछ स्थानीय श्रेणियों के डेटाबेस बनाए जाने पर उनके मान निश्चित होने चाहिए। आप अलग-अलग डेटाबेस के लिए अलग-अलग सेटिंग्स का उपयोग कर सकते हैं, लेकिन डेटाबेस बनने के बाद, आप उन्हें उस डेटाबेस के लिए बदल नहीं सकते। LC_COLLATE और LC_CTYPE ये श्रेणियां हैं। वे अनुक्रमित के क्रम को प्रभावित करते हैं, इसलिए उन्हें निश्चित रखा जाना चाहिए, या पाठ स्तंभों पर अनुक्रमित भ्रष्ट हो जाएंगे। ( लेकिन आप इस प्रतिबंध को टकराव का उपयोग करके समाप्त कर सकते हैं, जैसा कि धारा 22.2 में चर्चा की गई है। ) इन श्रेणियों के लिए डिफ़ॉल्ट मान इनटीडीबी चलने पर निर्धारित किए जाते हैं, और नए डेटाबेस बनाए जाने पर उन मानों का उपयोग किया जाता है, जब तक कि CREAT DATABASE कमांड में अन्यथा निर्दिष्ट नहीं किया जाता है।
मैं यहाँ बताए गए अनुसार आपके डेबियन ओएस पर एक सही स्थानीय एन्कोडिंग के साथ सब कुछ ठीक से भीख माँगने से पुनर्निर्माण करना चाहूँगा :
su root
अपनी स्थानीय सेटिंग्स को फिर से कॉन्फ़िगर करें:
dpkg-reconfigure locales
अपना स्थान चुनें (जैसे स्विट्जरलैंड में फ्रेंच के लिए उदाहरण: fr_CH.UTF8)
स्थापना रद्द करें और ठीक से साफ़ करें
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 (स्ट्रिंग क्रम क्रम) के साथ बनाया जाएगा।
डैनियल कुटिक का जवाब सही है, लेकिन डेटाबेस के नाम बदलने के साथ यह और भी सुरक्षित हो सकता है ।
तो, वास्तव में सुरक्षित तरीका है:
आपातकाल के मामले में, बस DBs वापस नाम बदलें
# 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"