2011-02-23 21 views
62

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

+1

भी देखें http://stackoverflow.com/q/380924 की – dsh

+1

संभव डुप्लिकेट [कैसे कर सकते हैं मैं एसक्यूएल या phpPgAdmin का उपयोग कर एक PostgreSQL डेटाबेस के लिए डेटाबेस एन्कोडिंग बदलने के?] (http://stackoverflow.com/questions/380924/how-can-i-change-database-encoding-for-a-postgresql-database-using-sql -या-phppga) – l0b0

उत्तर

47

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

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

यकीन है कि ग्राहक एन्कोडिंग यह सब के दौरान सही ढंग से सेट है।

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

+0

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

73

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

SQL_ASCII से कुछ और करने के लिए बदलने की विशेष मामले के लिए, आप को धोखा देने के कर सकते हैं और बस डेटाबेस एन्कोडिंग पुन: असाइन करने pg_database सूची प्रहार। यह मानता है कि आपने अपेक्षित एन्कोडिंग में किसी भी गैर-ASCII वर्णों को पहले ही संग्रहीत कर लिया है (या आपने अभी तक किसी भी गैर-ASCII वर्णों का उपयोग नहीं किया है)।

तो फिर तुम कर सकते हैं:

update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb' 

इस डेटाबेस का मिलान नहीं बदलेगा, कितना एन्कोडेड बाइट्स पात्रों में बदला जाता है (तो अब length('£123') 4 के बजाय 5 वापस आ जाएगी)। यदि डेटाबेस 'सी' संयोजन का उपयोग करता है, तो ASCII स्ट्रिंग के लिए ऑर्डर करने में कोई बदलाव नहीं होना चाहिए। आपको संभवतः गैर-ASCII वर्ण वाले किसी भी सूचकांक को पुनर्निर्माण करने की आवश्यकता होगी।

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

+1

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

+1

यह मुझे इस त्रुटि दे रहा है: '-bash: अप्रत्याशित टोकन के पास सिंटैक्स त्रुटि' (' ' –

8

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

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

और this: कुछ लोकेल श्रेणियों उनके मूल्यों जब डेटाबेस बनाई गई है तय कर दी है चाहिए। आप अलग-अलग डेटाबेस के लिए अलग-अलग सेटिंग्स का उपयोग कर सकते हैं, लेकिन डेटाबेस बनने के बाद, आप उन्हें उस डेटाबेस के लिए और नहीं बदल सकते हैं। एलसी_Cओएलएलएटी और एलसी_सीटीवाईईई इन श्रेणियां हैं। वे इंडेक्स के सॉर्ट ऑर्डर को प्रभावित करते हैं, इसलिए उन्हें निश्चित रखा जाना चाहिए, या टेक्स्ट कॉलम पर इंडेक्स भ्रष्ट हो जाएंगे। (लेकिन धारा 22.2।) पर चर्चा के अनुसार आप कोलेक्शन का उपयोग करके इस प्रतिबंध को कम कर सकते हैं। इन श्रेणियों के लिए डिफ़ॉल्ट मान निर्धारित किए जाते हैं जब initdb चलाया जाता है, और उन मानों का उपयोग तब किया जाता है जब नए डेटाबेस बनाए जाते हैं, जब तक कि अन्यथा निर्दिष्ट नहीं किया जाता डाटाबेस कमांड बनाएं।


मैं नहीं बल्कि के रूप में समझाया here ठीक से अपने डेबियन ओएस पर एक सही स्थानीय एन्कोडिंग के साथ शुरुआत से सब कुछ फिर से बनाना होगा:

su root 

पुनः कॉन्फ़िगर अपने स्थानीय सेटिंग्स:

dpkg-reconfigure locales 

चुनें अपने स्थान (स्विट्जरलैंड में फ्रेंच के लिए उदाहरण के लिए की तरह: fr_CH.UTF8)

,210

स्थापना रद्द करें और साफ ठीक से 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 (के साथ बनाया जा किया जाएगा स्ट्रिंग सॉर्ट ऑर्डर)।

+2

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

+0

tx, मैं इस सुधार में संशोधन :) – Douglas

5

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

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

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

आपात स्थिति के मामले में, बस डीबीएस नाम बदलने वापस

संबंधित मुद्दे