पोस्टग्रेज डेटाबेस के वर्ण एन्कोडिंग को आप कैसे बदलते हैं?


82

मेरे पास एक डेटाबेस है जो डिफ़ॉल्ट वर्ण सेट SQL_ASCII के साथ सेट किया गया था। मैं इसे UNICODE में बदलना चाहता हूं। क्या ऐसा करने का एक आसान तरीका है?


1
यह भी देखें stackoverflow.com/q/380924
dsh

जवाबों:


64

अपने डेटाबेस के एन्कोडिंग को बदलने के लिए:

  1. अपना डेटाबेस डंप करें
  2. अपना डेटाबेस गिराएं,
  3. अलग एन्कोडिंग के साथ नया डेटाबेस बनाएँ
  4. अपना डेटा पुनः लोड करें।

सुनिश्चित करें कि क्लाइंट एन्कोडिंग इस सब के दौरान सही ढंग से सेट है।

स्रोत: http://archives.postgresql.org/pgsql-novice/2006-03/msg00210210.p


इस बात पर कि मुझे लिंक से नहीं मिलता है "जाँच करें कि क्या पहले चरण में बनाई गई डंप फ़ाइल में कोई विशेष वर्ण हैं और आवश्यक परिवर्तन करते हैं" => क्या मुझे सभी विशेष वर्णों को मैन्युअल रूप से बदलना होगा
spankmaster79

1
क्या आप कृपया अपने जवाब में डंप करने और पुन: आयात करने की आज्ञा जोड़ सकते हैं? जैसे sudo -u postgres pg_dump your_db > /backups/postgresql.sql...
rubo77

104

सबसे पहले, डैनियल का जवाब सही, सुरक्षित विकल्प है।

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 स्ट्रिंग्स के लिए ऑर्डर करने के लिए कोई बदलाव नहीं होना चाहिए। हालांकि आपको गैर-एएससीआईआई अक्षरों वाले किसी भी सूचकांक के पुनर्निर्माण की संभावना होगी।

कैवियट खाली करनेवाला। डंपिंग और पुनः लोड करना आपके डेटाबेस की सामग्री की जांच करने का एक तरीका प्रदान करता है जो वास्तव में आपके द्वारा अपेक्षित एन्कोडिंग में है, और यह नहीं करता है। और अगर यह पता चला है कि आपके पास डेटाबेस में कुछ गलत तरीके से एन्कोडेड डेटा था, तो बचाव करना मुश्किल होने वाला है। तो अगर आप संभवतः, डंप और पुनर्निवेश कर सकते हैं।


1
+1 धन्यवाद। मेरी देव मशीन UTF8 एनकोडिंग का उपयोग करती है लेकिन मेरा उत्पादन LATIN1 का उपयोग करता है। मुझे इस वजह से बहुत इरोज़ आ रहे थे।
लुइज़ डेमिम

1
यह मुझे यह त्रुटि दे रहा है: -bash: syntax error near unexpected token (
अबिपासो घोष

@AbhipsoGhosh इसे बैश शेल में नहीं चिपकाया जाना चाहिए, बल्कि psqlप्रॉम्प्ट पर।
पियरे

14

एक विशिष्ट एन्कोडिंग के साथ एक डेटाबेस को डंप करना और एक अन्य डेटाबेस पर एक अलग एन्कोडिंग के साथ इसे पुनर्स्थापित करने का प्रयास करना डेटा भ्रष्टाचार का परिणाम हो सकता है। डेटा एन्कोडिंग को किसी भी डेटा को डेटाबेस में डाला जाना चाहिए।

चेक इस : जब किसी अन्य डेटाबेस को कॉपी, एन्कोडिंग और स्थान सेटिंग्स, स्रोत डेटाबेस के उन लोगों से बदला नहीं जा सकता, क्योंकि वह भ्रष्ट डेटा हो सकती है।

और यह : कुछ स्थानीय श्रेणियों के डेटाबेस बनाए जाने पर उनके मान निश्चित होने चाहिए। आप अलग-अलग डेटाबेस के लिए अलग-अलग सेटिंग्स का उपयोग कर सकते हैं, लेकिन डेटाबेस बनने के बाद, आप उन्हें उस डेटाबेस के लिए बदल नहीं सकते। 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 (स्ट्रिंग क्रम क्रम) के साथ बनाया जाएगा।


2
मुझे लगता है कि यह "dpkg-reconf कॉन्फ़िगर स्थान" है, बहुवचन। एकवचन रूप काम करने के लिए प्रतीत नहीं होता (बस जाँच की जाती है)।
फू

9

डैनियल कुटिक का जवाब सही है, लेकिन डेटाबेस के नाम बदलने के साथ यह और भी सुरक्षित हो सकता है ।

तो, वास्तव में सुरक्षित तरीका है:

  1. अलग एन्कोडिंग और नाम के साथ नया डेटाबेस बनाएँ
  2. अपना डेटाबेस डंप करें
  3. नए DB में डंप पुनर्स्थापित करें
  4. परीक्षण करें कि आपका एप्लिकेशन नए DB के साथ सही तरीके से चलता है
  5. पुराने DB का नाम कुछ सार्थक करने के लिए
  6. नए डीबी का नाम बदला
  7. टेस्ट आवेदन फिर से
  8. पुराना डेटाबेस ड्रॉप करें

आपातकाल के मामले में, बस DBs वापस नाम बदलें


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"   
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.