XHTML.net

Technology talks by Loïc d’Anterroches

News, articles, PHP, scripts, XHTML/CSS, …

  1. Home
  2. News

Joli cadeau de PostgreSQL

The 2007-10-30 at 13:03 by Loïc d'Anterroches filed under News.

PostgreSQL est un gestionnaire de base de données (RDBMS). C’est l’équivalent d’Oracle en libre. L’application de gestion de conférences que je développe en ce moment est écrite pour supporter toutes les langues avec l’utilisation d’UTF-8 de bout en bout. C’est très bien et cela permet d’utiliser des charactères genre ß, ö, õ, etc. Par contre, maintenant comment stocker ces informations dans la base de données ?

Par exemple, si je pose comme condition que le titre d’un résumé ne doit pas excéder 150 caractères, je pense 150 avec ß équivalent à 1 caractère. Mais avec l’encodage utf-8, cela veut dire que je dois utiliser une déclaration du type "VARCHAR(300)" car les caractères complexes sont en fait stockés sur 2 octets (en fait cela peut aller jusqu’à 6 octets) et que le 300 ici veut dire "une chaîne de caractères de 300 octets de long".

Petit bout de code pour illustrer avant d’aller plus loin :

<?php
header('Content-Type: text/plain; charset=utf-8');
$str = 'ßöpt';
echo('mb_strlen('.$str.')='.mb_strlen($str))."\n";
echo('strlen('.$str.')='.strlen($str))."\n";

Donne :

mb_strlen(ßöpt)=4
strlen(ßöpt)=6

En effet, ß et ö sont stockés sur 2 octets, et, p et t sont stockés sur 1. 2x2+2x1=6, mais on a bien 4 caractères typographiques.

La conclusion est que si j’autorise un titre de 150 caractères de long, il faut faire une déclaration à 150x6=900 "VARCHAR(900)" pour être certain que le titre sera effectivement stocké. Ce n’est pas très élégant.

La bonne nouvelle de PostgreSQL est qu’il est possible de déclarer une colonne de type character varying sans aucune limitation de taille, en ayant toujours la possibilité d’utiliser un index et sans aucune pénalité au niveau performance ! Merci pour ce joli cadeau qui me permet de ne plus avoir à me poser de questions…

Comments from readers

Laurentj said:

Ça m'étonne quand même qu'il faille tenir compte du nombre d'octet pour définir la longueur du varchar.

Dans mysql, quand tu fais varchar(5), c'est bien 5 caractères, et non pas 5 octets. Du coup, quand le champs est déclaré comme étant de l'utf8, tu peux vraiment y mettre 5 caractères.

Et ça fonctionne aussi dans postgresql, je viens de le vérifier avec une base créée pour de l'UTF-8.

Tu es sûr que tu n'a pas oublié de faire quelques choses dans ton schema postgresql ?

Voice your ideas

It is painless and I try not to kill electrons in the process.


Your email is required but will not be shared nor displayed.


Do you think your comment will force me to write even better stuff next time? If so, you simply rock.


Logo of Plume CMS