Skip to content

Commit

Permalink
charset.xml : relecture vs 14β2 - suite
Browse files Browse the repository at this point in the history
  • Loading branch information
Krysztophe authored and gleu committed Jul 23, 2021
1 parent f6f34a8 commit d797898
Showing 1 changed file with 85 additions and 91 deletions.
176 changes: 85 additions & 91 deletions postgresql/charset.xml
Original file line number Diff line number Diff line change
Expand Up @@ -345,103 +345,100 @@
Cette fonctionnalité permet de définir par colonne, ou pour chaque requête,
la collation utilisée pour déterminer l'ordre de tri et le classement des
caractères.
Cette fonctionnalité permet de lever la restriction sur les paramètres
Elle permet de lever la restriction sur les paramètres
<symbol>LC_COLLATE</symbol> et <symbol>LC_CTYPE</symbol> d'une base de
données et qui ne pouvaient pas être modifiés après sa création.
données, qui ne pouvaient pas être modifiés après sa création.
</para>

<sect2>
<title>Concepts</title>

<para>
Conceptuellement, toute expression d'un type de donnée qui est collatable a
une collation. (Les types de données intégrés qui supportent
une collation sont <type>text</type>, <type>varchar</type>,
et <type>char</type>. Les types de données définies par l'utilisateur
peuvent aussi être marqués comme supportant la collation, et
bien entendu un domaine qui est défini sur un type de données
supportant la collation est, lui aussi, collationnable.)
Si l'expression est une colonne, la collation de l'expression est déterminée
Conceptuellement, toute expression d'un type de donnée supportant les collations a
une collation. (Les types de données intégrés supportant
les collations sont <type>text</type>, <type>varchar</type>,
et <type>char</type>. Les types de données définis par l'utilisateur
peuvent aussi être marqués comme supportant les collations.
Bien entendu, un domaine défini sur un type de données
supportant les collations les supporte aussi.)
Si l'expression est une référence de colonne, la collation de l'expression est déterminée
par la collation de la colonne. Si l'expression est une constante, la collation
utilisée sera la collation par défaut du type de données de la constante. La
sera celle par défaut du type de la constante. La
collation d'une expression plus complexe est déterminée à partir des
différentes collations de ses entrées, comme cela est décrit ci-dessous.
</para>

<para>
Une expression peut prendre la collation par défaut, <quote>default</quote>,
c'est à dire la collation définie au niveau de la base de données. Il est
c'est-à-dire la collation définie au niveau de la base de données. Il est
possible que la collation d'une expression soit indéterminée. Dans un tel cas,
les opérations de tri et les autres opérations qui ont besoin de connaître
les tris et les autres opérations ayant besoin de connaître
la collation vont échouer.
</para>

<para>
Lorsque la base de données doit réaliser un tri ou classement de caractères,
alors elle utilisera la collation de l'expression en entrée. Ce cas se
présentera, par exemple, si vous employez la clause <literal>ORDER BY</literal>
et des appels à des fonctions ou des opérateurs tels que <literal>&lt;</literal>.
La collation qui s'applique à une clause <literal>ORDER BY</literal> est
simplement la collation de la clé de tri. La collation qui s'applique pour
l'appel à une fonction ou à un opérateur est dérivé des arguments, comme
elle utilise la collation de l'expression entrée. Ce cas se
présentera, par exemple, avec des clauses <literal>ORDER BY</literal>,
ou des appels à des fonctions ou opérateurs tels que <literal>&lt;</literal>.
La collation à appliquer à une clause <literal>ORDER BY</literal> est
simplement la collation de la clé de tri. La collation à appliquer pour
l'appel à une fonction ou à un opérateur est dérivée des arguments, comme
décrit plus bas. En plus de s'appliquer aux opérateurs de comparaison, les
collations sont également prises en compte par les fonctions qui réalisent
les conversions entre minuscules et majuscules, comme <function>lower</function>,
<function>upper</function> et <function>initcap</function>&nbsp;; par les opérateurs de
correspondance de motifs et par <function>to_char</function> et les fonctions affiliées.
collations sont également prises en compte par les fonctions qui
convertissent entre minuscules et majuscules, comme <function>lower</function>,
<function>upper</function> et <function>initcap</function>, par les opérateurs de
correspondance de motifs, et par <function>to_char</function> et les fonctions affiliées.
</para>

<para>
Pour un appel à une fonction ou un opérateur, la collation est déterminée
à partir de la collation des arguments qui sont passés à l'exécution de
l'opération. Si une expression voisine nécessite de connaître la collation
de la fonction ou de l'opérateur, et si le type de données du résultat
de l'appel possède une collation alors cette collation est interprétée
comme la collation de l'expression au moment de l'analyse.
Pour un appel à une fonction ou un opérateur, la collation dérivée
des collations des arguments est utilisée à l'exécution de
l'opération. Si le type du résultat
de la fonction ou de l'opérateur supporte les collations, alors cette collation est utilisée
dès l'analyse en tant que la collation de la fonction ou de l'opérateur,
au cas où une expression voisine nécessiterait de la connaître.
</para>

<para>
Le <firstterm>calcul de la collation</firstterm> d'une expression est
réalisé implicitement ou explicitement. Cette distinction affecte la façon
dont les collations sont combinées entre elles lorsque plusieurs collations
différentes sont utilisées dans une expression. La collation d'une expression
peut être déterminée explicitement par l'emploi de la clause <literal>COLLATE</literal>&nbsp;;
dans les autres cas, la collation est déterminée de manière implicite. Les règles
dont les collations sont combinées entre elles quand plusieurs collations
différentes apparaissent dans une expression.
Une dérivation explicite utilise la clause <literal>COLLATE</literal>&nbsp;;
dans tous les autres cas, la dérivation de collation est implicite. Les règles
suivantes s'appliquent lorsque plusieurs collations doivent être utilisée en
même temps, par exemple dans un appel à une fonction, les règles suivantes
s'appliquent:
même temps, par exemple dans un appel à une fonction&nbsp;:

<orderedlist>
<listitem>
<para>
Si la collation d'une expression d'entrée est déclarée explicitement
alors les collations déclarée explicitement pour les autres
expressions d'entrées doivent être les mêmes, sinon une erreur est levée.
Si une expression en entrée contient une collation explicite,
toutes les collations explicitement dérivées parmi les expressions
en entrée doivent être identiques. Dans le cas contraire, une
erreur est renvoyée. Si une collation dérivée explicitement est
Si une expression en entrée porte une dérivation de collation explicite,
alors toutes les collations explicitement dérivées des autres
expressions en entrées doivent être identiques, sinon une erreur est levée.
Si une collation explicitement dérivée est
présente, elle est le résultat de la combinaison des collations.
</para>
</listitem>

<listitem>
<para>
Dans les autres cas, toutes les expressions en entrée doivent avoir
la même collation, qu'elle soit implicite ou déterminée à partir
de la collation par défaut. Si une collation est présente, autre
que celle par défaut, elle est le résultat de la combinaison des
la même collation, qu'elle soit implicitement dérivée, ou
celle par défaut. Si est présente une collation autre
que celle par défaut, alors elle est aussi le résultat de la combinaison des
collations. Sinon, le résultat correspond à la collation par
défaut.
</para>
</listitem>

<listitem>
<para>
S'il existe des collations implicites mais non par défaut qui
entrent en conflit avec les expressions en entrée, alors la
S'il existe, parmi les expressions en entrées,
des collations implicites, qui ne sont pas celles par défaut,
et qui entrent en conflit, alors la
combinaison ne peut aboutir qu'à une collation indéterminée. Ce
n'est pas une erreur sauf si la fonction appelée requiert une
n'est pas une erreur, sauf si la fonction appelée requiert une
application de la collation. Dans ce cas, une erreur est
renvoyée lors de l'exécution.
</para>
Expand All @@ -461,26 +458,26 @@ CREATE TABLE test1 (
<programlisting>
SELECT a &lt; 'foo' FROM test1;
</programlisting>
la comparaison <literal>&lt;</literal> est réalisée en tenant compte
des règles de la locale <literal>de_DE</literal>, parce que l'expression
combine la collation calculée implicitement avec la collation par défaut.
la comparaison <literal>&lt;</literal> est réalisée selon
les règles de la locale <literal>de_DE</literal>, car l'expression
combine une collation dérivée implicitement avec la collation par défaut.
Mais, dans la requête
<programlisting>
SELECT a &lt; ('foo' COLLATE "fr_FR") FROM test1;
</programlisting>
la comparaison est effectuée en utilisant les règles de la locale <literal>fr_FR</literal>,
parce que l'utilisation explicite de cette locale prévaut sur la locale
déterminée de manière implicite.
implicite.
De plus, avec la requête
<programlisting>
SELECT a &lt; b FROM test1;
</programlisting>
l'analyseur ne dispose pas des éléments pour déterminer quelle collation
employer, car les collations des colonnes <structfield>a</structfield> et <structfield>b</structfield>
sont différentes. Comme l'opérateur <literal>&lt;</literal> a besoin de connaître
quelle locale utiliser, une erreur sera générée. Cette erreur peut être résolue
sont différentes. Comme l'opérateur <literal>&lt;</literal> a besoin de savoir
la locale à utiliser, on obtiendra une erreur. Elle peut être résolue
en attachant une déclaration de collation explicite à l'une ou l'autre des expressions
d'entrées, soit:
d'entrées, soit&nbsp;:
<programlisting>
SELECT a &lt; b COLLATE "de_DE" FROM test1;
</programlisting>
Expand All @@ -489,33 +486,31 @@ SELECT a &lt; 'foo' FROM test1;
SELECT a COLLATE "de_DE" &lt; b FROM test1;
</programlisting>

Toutefois, pour un cas structurellement similaire comme
Toutefois, dans ce cas suivant, structurellement similaire,
<programlisting>
SELECT a || b FROM test1;
</programlisting>
ne retournera pas d'erreur car l'opérateur <literal>||</literal> ne tient
pas compte des collations: son résultat sera le même quel que soit
la collation.
il n'y aura pas d'erreur, car l'opérateur <literal>||</literal> ne tient
pas compte des collations&nbsp;: son résultat sera le même quelle qu'elle soit.
</para>

<para>
La collation qui est assignée à une fonction ou à une combinaison d'un
La collation assignée à une fonction ou à une combinaison d'un
opérateur avec ses expressions d'entrées s'applique également au résultat
de la fonction ou de l'opérateur. Bien évidemment, cela s'applique que si
la fonction de l'opérateur délivre un résultat dans un type de données auquel
la collation peut s'appliquer. Ainsi, dans la requête
de la fonction ou de l'opérateur, si le résultat est d'un type supportant les collations.
Ainsi, dans la requête
<programlisting>
SELECT * FROM test1 ORDER BY a || 'foo';
</programlisting>
le tri sera réalisé en fonction des règles de la locale <literal>de_DE</literal>.
Mais cette requête:
Mais cette requête&nbsp;:
<programlisting>
SELECT * FROM test1 ORDER BY a || b;
</programlisting>
retournera une erreur car bien que l'opérateur <literal>||</literal> ne tienne pas
compte des collations de ses expressions, la clause <literal>ORDER BY</literal> en tient
compte. Comme précédemment, ce conflit peut être résolue par l'emploi d'une
déclaration explicite de la collation:
retournera une erreur car, bien que l'opérateur <literal>||</literal> ne tienne pas
compte des collations de ses expressions, la clause <literal>ORDER BY</literal>, elle, en tient
compte. Comme précédemment, ce conflit peut être résolu par l'emploi d'une
déclaration explicite de la collation&nbsp;:
<programlisting>
SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR";
</programlisting>
Expand All @@ -526,42 +521,41 @@ SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR";
<title>Gestion des collations</title>

<para>
Une collation est un objet du catalogue dont le nom au niveau SQL
correspond à une locale fournie par les bibliothèques installées sur le système. Une
définition de la collation a un <firstterm>fournisseur</firstterm> spécifiant quelle bibliothèque
Une collation est un objet du catalogue SQL qui associe un nom SQL
à une locale fournie par les bibliothèques installées sur le système. Une
définition de collation a un <firstterm>fournisseur</firstterm>, qui spécifie quelle bibliothèque
fournit les données locales. L'un des fournisseurs standards est <literal>libc</literal>,
qui utilise les locales fournies par la bibliothèque C du système. Ce sont les locales
les plus utilisées par des outils du système. Un autre fournisseur est
utilisées par la plupart des outils du système. Un autre fournisseur est
<literal>icu</literal>, qui utilise la bibliothèque externe
ICU<indexterm><primary>ICU</primary></indexterm>. Les locales ICU peuvent
seulement être utilisées si le support d'ICU a été configuré lors de la
construction de PostgreSQL.
ICU<indexterm><primary>ICU</primary></indexterm>. Les locales ICU ne peuvent
être utilisées que si le support d'ICU a été configuré lors de la
compilation de PostgreSQL.
</para>

<para>
Un objet de type collation fourni par <literal>libc</literal> pointe sur
Un objet de type collation fourni par la <literal>libc</literal> pointe sur
une combinaison de paramètres <symbol>LC_COLLATE</symbol> et
<symbol>LC_CTYPE</symbol>, comme accepté par l'appel système
<symbol>LC_CTYPE</symbol>, comme acceptés par l'appel système
<literal>setlocale()</literal>.
(Comme le nom le suggère, le principal objectif d'une collation est de
positionner <symbol>LC_COLLATE</symbol> qui contrôle l'ordre de tri.
positionner <symbol>LC_COLLATE</symbol>, qui contrôle l'ordre de tri.
Dans la pratique, il est très rarement nécessaire de définir un
paramètre <symbol>LC_CTYPE</symbol> différent de
<symbol>LC_COLLATE</symbol>. De cette façon, il est plus facile de
regrouper ces deux paramètres dans un même concept plutôt que de créer
<symbol>LC_COLLATE</symbol>. Il est donc plus facile de
regrouper ces deux paramètres dans un même concept, que de créer
une infrastructure différente simplement pour pouvoir positionner
<symbol>LC_CTYPE</symbol> pour chaque requête.) De la même façon, une
collation <literal>libc</literal> est liée à un jeu de caractère (voir <xref linkend="multibyte"/>).
Ainsi, plusieurs jeux de caractères peuvent utiliser une collation portant
le même nom.
<symbol>LC_CTYPE</symbol> pour chaque expression.) De la même façon, une
collation <literal>libc</literal> est liée à un encodage de jeu de caractère (voir <xref linkend="multibyte"/>).
Le même nom de collation peut exister pour différents encodages.
</para>

<para>
Un objet de type collation fourni par <literal>icu</literal> pointe sur un collateur nommé
fourni par la bibliothèque ICU. ICU ne permet pas de paramétrages
<quote>collate</quote> et <quote>ctype</quote> séparés, ils sont donc
fourni par la bibliothèque ICU. ICU ne permet pas de séparer
<quote>collate</quote> et <quote>ctype</quote>, ils sont donc
toujours les mêmes. De même, les collations ICU sont indépendantes de
l'encodage, donc il n'y a toujours qu'une seule collation ICU pour un nom donné dans une
l'encodage&nbsp;; il n'y a donc toujours qu'une seule collation ICU pour un nom donné dans une
base de données.
</para>

Expand All @@ -570,10 +564,10 @@ SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR";

<para>
Les collations nommées <literal>default</literal>, <literal>C</literal>, et <literal>POSIX</literal>
sont disponibles sur toutes les plateformes. Les collations complémentaires seront
ou non disponibles en fonction de leur support au niveau du système d'exploitation.
La collation <literal>default</literal> permet d'utiliser les valeurs de
<symbol>LC_COLLATE</symbol> et <symbol>LC_CTYPE</symbol> telles que
sont disponibles sur toutes les plateformes. Des collations complémentaires peuvent
être disponibles, ou non, en fonction du support au niveau du système d'exploitation.
La collation <literal>default</literal> utilise les valeurs de
<symbol>LC_COLLATE</symbol> et <symbol>LC_CTYPE</symbol>
définies à la création de la base de données. Les collations <literal>C</literal> et
<literal>POSIX</literal> spécifient toutes deux le comportement <quote>traditionnel C</quote>,
dans lequel seuls les caractères ASCII de <quote><literal>A</literal></quote> à
Expand Down

0 comments on commit d797898

Please sign in to comment.