web-dev-qa-db-fra.com

Comment changer le codage de la collection de bases de données de modèles

Je veux construire une nouvelle base de données postgreSQL en:

CREATE DATABASE newdb
WITH OWNER = postgres
   ENCODING = 'UTF8'
   TABLESPACE = pg_default
   LC_COLLATE = 'zh_CN.UTF-8'
   CONNECTION LIMIT = -1;

et l'erreur est:

ERREUR: le nouveau classement (zh_CN.UTF-8) est incompatible avec le classement de la base de données de modèles (en_US.UTF8)
CONSEIL: utilisez le même classement que dans la base de données de modèles ou utilisez template0 comme modèle.

Comment changer la collection de base de données de modèles?

26
user504909

De la documentation PostgreSQL :

Une autre raison courante pour copier template0 au lieu de template1 est que de nouveaux paramètres d'encodage et de paramètres régionaux peuvent être spécifiés lors de la copie de template0, alors qu'une copie de template1 doit utiliser les mêmes paramètres que lui. Cela est dû au fait que template1 peut contenir des données spécifiques au codage ou spécifiques aux paramètres régionaux, tandis que template0 est connu pour ne pas le faire.

Vous ne pouvez utiliser que template0 pour créer une nouvelle base de données avec différents encodages et paramètres régionaux:

CREATE DATABASE newdb
WITH OWNER = postgres
   ENCODING = 'UTF8'
   TABLESPACE = pg_default
   LC_COLLATE = 'zh_CN.UTF-8'
   CONNECTION LIMIT = -1
   TEMPLATE template0;

Cela fonctionnera, mais cela signifie que toutes les modifications que vous avez apportées à template1 ne sera pas appliqué à la base de données nouvellement créée.

Pour modifier l'encodage et le classement de template1 vous devez d'abord supprimer template1 puis créez un nouveau modèle template1 de template0. La façon de supprimer la base de données de modèles est décrite ici . Ensuite, vous pouvez créer une nouvelle base de données template1 avec l'encodage/classement choisi et le marquer comme modèle en définissant datistemplate=true ( exemple ):

update pg_database set datistemplate=true  where datname='template1';
40
Tomas Greif