PG :: त्रुटि: त्रुटि: नया एन्कोडिंग (UTF8) असंगत है


84

मैंने postgresql-9.2.4स्रोत से स्थापित किया है, अब जब मैं निष्पादित करता हूं तो रेल एप्लिकेशन में:

rake db:create आज्ञा मुझे मिलती है:

$ bin/rake db:create RAILS_ENV="test"
PG::Error: ERROR:  new encoding (UTF8) is incompatible with the encoding of the template database (SQL_ASCII)
HINT:  Use the same encoding as in the template database, or use template0 as template.
: CREATE DATABASE "verticals_test" ENCODING = 'unicode'
/home/vagrant/my-project/.gems/ruby/1.9.1/gems/activerecord-3.2.12/lib/active_record/connection_adapters/postgresql_adapter.rb:652:in `exec
....
bin/rake:16:in `load'
bin/rake:16:in `<main>'
Couldn't create database for {"adapter"=>"postgresql", "encoding"=>"unicode", "database"=>"my_db", "host"=>"localhost", "pool"=>5, "username"=>"my_user", "password"=>"my_password"}

कोई उपाय?

जवाबों:


229

ठीक है, नीचे दिए गए चरणों ने समस्या का समाधान किया:

  1. सबसे पहले, हमें टेम्प्लेट 1 को छोड़ना होगा। टेम्प्लेट नहीं गिराए जा सकते, इसलिए हम पहले इसे टी के एक साधारण डेटाबेस में बदलते हैं:

    UPDATE pg_database SET datistemplate = FALSE WHERE datname = 'template1';

  2. अब हम इसे छोड़ सकते हैं:

    DROP DATABASE template1;

  3. अब नया डिफ़ॉल्ट एन्कोडिंग के साथ टेम्पलेट 0 से डेटाबेस बनाने का समय है:

    CREATE DATABASE template1 WITH TEMPLATE = template0 ENCODING = 'UNICODE';

  4. अब template1 को संशोधित करें ताकि यह वास्तव में एक टेम्पलेट हो:

    UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template1';

  5. अब टेम्पलेट 1 पर जाएँ और टेम्पलेट खाली करें:

    \c template1

    VACUUM FREEZE;

समस्या का समाधान होना चाहिए।


1
@tokhi यह काम कर रहा समाधान है। मैं posgresql के लिए बहुत परिचित नहीं हूं, लेकिन मेरा एकमात्र छोटा कदम 0: sudo -u postgres psql postgresडेबियन या इसी तरह के ओएस के लिए।
क्रॉन्क्स

41

सुनिश्चित करें कि आपकी database.ymlफ़ाइल में सही सेटअप है । आप का उपयोग करना चाहिए template0, क्योंकि त्रुटि का सुझाव है:

test:
  adapter: postgresql
  encoding: unicode
  database: your_db_name
  template: template0
  host: localhost
  ...

मेरे पास template0मेरे विन्यास में नहीं था , अगर मुझे जगह मिलती है:PG::Error: ERROR: permission denied to copy database "template0" : CREATE DATABASE "my_database_test" ENCODING = 'unicode' TEMPLATE = "template0"
तोखी

यह अजीब है ... क्या यह developmentएनवी के लिए समान व्यवहार करता है ?
मिहाई

3
क्या कोई भी टेम्पलेट 0 और टेम्पलेट 1 के बीच अंतर बता सकता है और यह क्यों काम करता है?
जेक

@ जेक देखें postgresql.org/docs/10/static/manage-ag-templatedbs.html - इस पेज को पढ़ने के बाद सब कुछ समझ में आता है :-)
मार्कस

12

यदि आप डेबियन का उपयोग करते हैं, तो जब आप पोस्टग्रैस्कल पैकेज स्थापित करते हैं तो यह टेम्पलेट 1 डेटाबेस बनाने के लिए आपके डिफ़ॉल्ट लोकेल का उपयोग करेगा। यदि आपने अपने OS को डिफ़ॉल्ट लोकेल के रूप में UTF-8 का उपयोग करने के लिए कॉन्फ़िगर नहीं किया है, तो आप इस त्रुटि का सामना करेंगे।

उपरोक्त समाधानों के अलावा, यदि आप एक नई स्थापना पर हैं और कोई सक्रिय डेटाबेस नहीं है, तो आप पोस्टग्रैस्कल पैकेज को हटा सकते हैं और अपने डिफ़ॉल्ट लोकल को UTF-8 में सेट कर सकते हैं। इस पद्धति का लाभ यह है कि आप भविष्य में डेटाबेस बनाते समय स्थानीय जानकारी को छोड़ सकते हैं।

dpkg-reconfigure locales

यदि आपको इच्छित स्थान दिखाई नहीं देता है, तो सभी स्थानों को स्थापित करें

apt-get install locales-all

फिर पोस्टग्रैसक्ल को हटा दें

apt-get remove --purge postgresql-<version>

फिर पुनर्स्थापना या बेहतर अभी तक एक हालिया रिलीज में अपग्रेड करें जो डेबियन स्थिर में नहीं है


2
मैंने अपना डिफ़ॉल्ट स्थान en_US.UTF-8 पर सेट किया और पोस्टग्रेज को फिर से स्थापित करने के लिए आपके निर्देशों का पालन किया, और उसके बाद भी वही त्रुटि मिली।
साइमन वुडसाइड

साइमन से सहमत। क्या समय की बर्बादी :(
karni

स्थान स्थापित करने के बाद, यह जादू की तरह काम कर गया :)
डैनियल गोर्डी

6

मेरे लिए, मैं बस से लाइन बदल रहा हूँ database.yml:

encoding: unicode

सेवा:

encoding: SQL_ASCII

बस यह और यह सब काम करता है।


2
यह स्वीकार किए गए समाधान से बेहतर है, लेकिन मैं इस सामान के लिए नया हूं इसलिए मुझे SQL_12CII के यूनिकोड को बदलने के प्रभावों के बारे में पता नहीं हो सकता है।
इंडीनिक मार्क

1
SQL_ASCII का उपयोग करना एक महान डिफ़ॉल्ट नहीं है।
डग

5

यदि आपका पोस्टग्रेज इंस्टॉलेशन नया है और आपने अभी तक किसी भी डेटाबेस को पॉपुलेट नहीं किया है, तो आप अपनी dataनिर्देशिका को हटा सकते हैं और यूटीएफ -8 का उपयोग कर डेटाबेस बनाने के लिए फ्लैग के साथ इनटीडीबी कमांड को फिर से चला सकते हैं।

अपने पोस्टग्रेज इंस्टॉलेशन से मिलान करने के लिए इस कमांड को संशोधित करें। -Eध्वज बताता है कि वर्ण एन्कोडिंग डिफ़ॉल्ट होना चाहिए। अन्य चरित्र एनकोडिंग यहाँ सूचीबद्ध हैं

/usr/local/pgsql/bin/initdb -E UTF8 -D /usr/local/pgsql/data -U postgres

यह त्रुटि करना चाहिए और आपको बताएगा कि dataनिर्देशिका खाली नहीं है। निर्देशों का पालन करें और निर्देशिका को हटा दें, फिर कमांड को फिर से चलाएं। (या, dataशुरू करने से पहले निर्देशिका को हटा दें , लेकिन अपने लिए निर्देश देखना हमेशा अच्छा होता है।)


2

मेरा मुद्दा भी ऐसा ही था। मेरा डेटाबेस। इस तरह था: -

default: &default
  adapter: postgresql
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: chatapp_development

test:
  <<: *default
  database: chatapp_test

production:
  <<: *default
  database: chatapp_production
  username: chatapp
  password: <%= ENV['CHATAPP_DATABASE_PASSWORD'] %>

मैंने टेम्प्लेट जोड़ा: टेम्पलेट 0 डिफ़ॉल्ट सेटिंग्स पर

default: &default
  adapter: postgresql
  template: template0
  encoding: unicode
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

और इसने काम किया


आह, आदेश महत्वपूर्ण है! template: template0 चाहिए पहले आते हैं encoding: unicodeऐसा लगता है।
डेन बेचर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.