What is going wrong with postgresql initdb? Why is the `UTF-8` encoding not getting enforced?

35,084

Solution 1

Looks like you are calling initdb through a runlevel script of the OS. This script might not pass on the parameters. You better try executing initdb directly, you will need to perform the following steps starting as root and assuming the OS user account for the database is postgres.

mkdir <your data dir>
chown postgres <your data dir>
su postgres
initdb --pgdata=<your data dir> -E 'UTF-8' --lc-collate='en_US.UTF-8' --lc-ctype='en_US.UTF-8'

Solution 2

Debian PostgreSQL installation automatically calls the initdb i.e. it initializes the cluster with default encoding and locale. Encoding can be changed later but the locale cannot. To change the locale (an possibly other options in initdb), delete the existing default cluster and create a new one:

Take root privileges.
Run the following command:



 pg_dropcluster --stop <version> main

For example:

pg_dropcluster --stop 8.3 main

Run the initdb with your options. For example:

pg_createcluster --locale de_DE.UTF-8 --start 8.3 main

Warning!

The previous operation obviously deletes everything you had in cluster databases. Perform this operation right after you have installed the base package. Check the PostgreSQL manual if you need to change locale for an existing database (it is not a trivial operation).

Share:
35,084
ThinkingMonkey
Author by

ThinkingMonkey

Free-Thinker, Individualist, INTP

Updated on July 09, 2022

Comments

  • ThinkingMonkey
    ThinkingMonkey almost 2 years

    I am using PostgreSQL 9.1. Trying to enforce UTF8 encoding as default.

    This is what I am doing.

    service postgresql initdb -E 'UTF-8' --lc-collate='en_US.UTF-8' --lc-ctype=locale='en_US.UTF-8';
    

    Although the initilization process goes on without any problem,

    a \l at the psql prompt gives there details.

                             List of databases
       Name    |  Owner   |Encoding  | Collate | Ctype |   Access privileges   
    -----------+----------+----------+---------+-------+-----------------------
      postgres | postgres | LATIN1 | en_US&nbsp;| en_US| 
    

    Why is the UTF-8 encoding not getting enforced?

  • ThinkingMonkey
    ThinkingMonkey almost 12 years
    You are right. Although I couldn't run initdb directly as a superuser. gave an initdb: cannot be run as root Please log in (using, e.g., "su") as the (unprivileged) user that will own the server process. error. After logging in as an unprivileged user I was able to initialize the db with the proper encoding.
  • Eelke
    Eelke almost 12 years
    Forgot about it being a bit picky, updated the answer with the full set of commands that might be needed.
  • Sorin Postelnicu
    Sorin Postelnicu about 9 years
    Hello guys! Do you have any idea why I get: initdb: invalid locale name "'en_US.UTF-8'" ? I have also tried without the quotes, but then I get initdb: invalid locale name "en_US.UTF-8". I have downloaded the Postgresql9.4.1 binaries (not the installer) for Windows. Is the locale en_US.UTF-8 not available in the Windows binaries?
  • Alkanshel
    Alkanshel about 7 years
    Thank you @Eelke, en-US works... and absolutely nothing else does.