Chaînes de caractères

Une chaîne de caractères est une séquence d'unités de code. La longueur de la chaîne est le nombre d'unités de code dans la séquence. Si la longueur est égale à zéro, la valeur est appelée chaîne vide, qui ne doit pas être confondue avec la valeur null.

Chaîne de caractères de longueur fixe (CHAR)

Toutes les valeurs d'une colonne de chaîne de longueur fixe ont la même longueur, qui est déterminée par l'attribut de longueur de la colonne. L'attribut de longueur doit être compris entre 1 et 255 inclus, sauf si l'unité de chaîne est CODEUNITS32, qui est comprise entre 1 et 63 inclus.

Chaînes de caractères de longueur variable

Il existe deux types de chaînes de caractères de longueur variable:
VARCHAR
Une valeur VARCHAR peut comporter jusqu'à 32 672 octets. Si l'unité de chaîne est CODEUNITS32, la longueur peut atteindre 8 168 unités de chaîne.
CLOB
Une valeur d'objet CLOB peut atteindre jusqu'à 2 gigaoctets moins 1 octet (2 147 483 647 octets) de long ou, si l'unité de chaîne est CODEUNITS32, jusqu'à 536 870 911 unités de chaîne. Un objet CLOB est utilisé pour stocker de grandes données basées sur des caractères SBCS ou mixtes (SBCS et MBCS) (par exemple, des documents écrits avec un jeu de caractères unique) et, par conséquent, il est associé à une page de codes SBCS ou mixte.
Des restrictions spéciales s'appliquent aux expressions qui génèrent un type de données CLOBet aux colonnes de type structuré ; ces expressions et colonnes ne sont pas autorisées dans:
  • Liste SELECT précédée de la clause DISTINCT
  • une clause GROUP BY ;
  • une clause ORDER BY ;
  • Sous-requête d'un opérateur d'ensemble autre que UNION ALL
  • Un prédicat de base, quantifié, BETWEEN ou IN
  • Une fonction d'agrégation
  • Fonctions scalaires VARGRAPHIC, TRANSLATE et datetime
  • L'opérande de modèle dans un prédicat LIKE ou l'opérande de chaîne de recherche dans une fonction POSSTR
  • Représentation sous forme de chaîne d'une valeur de date-heure.

Les fonctions du schéma SYSFUN prenant un VARCHAR comme argument n'acceptent pas les VARCHARs d'une longueur supérieure à 4 000 octets comme argument. Toutefois, la plupart de ces fonctions ont également une autre signature acceptant un objet CLOB (1M). Pour ces fonctions, l'utilisateur peut explicitement transtyper les chaînes supérieures à 4 000 VARCHAR en CLOB, puis refondre le résultat en VARCHARs de la longueur requise.

Les chaînes de caractères à terminaison NUL qui se trouvent dans C sont traitées différemment, en fonction du niveau standard de l'option de précompilation.

Chaque chaîne de caractères est définie comme l'une des suivantes:
données binaires
Données qui ne sont pas associées à une page de codes.
Données SBCS (jeu de caractères mono-octet)
Données dans lesquelles chaque caractère est représenté par un octet unique.
données mixtes
Données pouvant contenir un mélange de caractères d'un jeu de caractères mono-octet et d'un jeu de caractères multi-octets (MBCS).
Remarque: Le type de données LONG VARCHAR continue d'être pris en charge mais est obsolète, déconseillé et peut être supprimé dans une édition ultérieure.

Spécification des unités de chaîne pour les chaînes de caractères

L'unité de longueur du type de données chaîne de caractères est OCTETS ou CODEUNITS32. L'unité de longueur définit la méthode de comptage utilisée pour déterminer la longueur des données.
OCTETS
Indique que les unités d'attribut de longueur sont des octets. OCTETS s'applique à toutes les données de type chaîne de caractères d'une base de données non Unicode. Dans une base de données Unicode, les octets peuvent être explicitement spécifiés ou déterminés en fonction d'un paramètre d'environnement.
CODEUNITS32
Indique que les unités d'attribut de longueur sont des unités Unicode de code UTF-32 qui fournissent un comptage approximatif en caractères. Cette unité de longueur n'a aucune incidence sur la page de codes sous-jacente du type de données. La longueur réelle d'une valeur de données est déterminée par le comptage des unités de code UTF-32 comme si les données étaient converties en UTF-32. Une unité de chaîne CODEUNITS32 ne peut être utilisée que dans une base de données Unicode. CODEUNITS32 peut être explicitement spécifié ou déterminé en fonction d'un paramètre d'environnement.

Dans une base de données non Unicode, l'unité de chaîne est toujours OCTETS et ne peut pas être modifiée. Dans une base de données Unicode, les unités de chaîne peuvent être explicitement spécifiées avec l'attribut de longueur d'un type de données de chaîne de caractères ou être définies par défaut en fonction d'un paramètre d'environnement. Si FOR BIT DATA est également spécifié pour le type de données chaîne de caractères, CODEUNITS32 ne peut pas être spécifié et un paramètre d'environnement de CODEUNITS32 ne s'applique pas.

Le paramètre d'environnement pour les unités de chaîne est basé sur la valeur de la variable globale NLS_STRING_UNITS ou sur le paramètre de configuration de la base de données string_units . Le paramètre de configuration de base de données peut être défini sur SYSTEM ou CODEUNITS32. La variable globale peut également être définie sur SYSTEM ou CODEUNITS32, mais peut également être définie sur NULL. La valeur NULL indique que la session SQL doit utiliser le paramètre de configuration de base de données string_units . Si la valeur du paramètre d'environnement est SYSTEM, OCTETS est utilisé comme paramètre d'unités de chaîne par défaut.

Unités de chaîne dans les fonctions intégrées

La possibilité de spécifier des unités de chaîne pour certaines fonctions de chaîne intégrées vous permet de traiter les données de chaîne d'une manière plus "basée sur les caractères" qu'une "basée sur les octets". L' unité de chaîne détermine l'unité utilisée pour la longueur ou la position lorsque vous exécutez la fonction. Vous pouvez spécifier CODEUNITS16, CODEUNITS32ou OCTETS comme unité de chaîne pour certaines fonctions de chaîne. Lorsqu'aucune unité de chaîne n'est spécifiée, l'unité de chaîne par défaut est généralement déterminée par les unités de chaîne de l'argument de chaîne source (reportez-vous à la description de la fonction que vous utilisez pour plus de détails). L'argument des unités de chaîne peut être spécifié pour les fonctions de chaîne qui prennent en charge le paramètre dans les bases de données Unicode ou non Unicode.

CODEUNITS16
Indique qu'Unicode UTF-16 est l'unité de l'opération. CODEUNITS16 est utile lorsqu'une application traite des données dans des unités de code de 2 octets de largeur. Notez que certains caractères, appelés caractères supplémentaires, nécessitent deux unités de code UTF-16 pour être codées. Par exemple, le symbole musical G clef requiert deux unités de code UTF-16 (X'D834' et X'DD1E' dans UTF-16BE).
CODEUNITS32
Indique qu'Unicode UTF-32 est l'unité de l'opération. CODEUNITS32 est utile pour les applications qui traitent des données dans un format simple et de longueur fixe et qui doivent renvoyer la même réponse quel que soit le format de stockage des données (ASCII, UTF-8ou UTF-16).
Remarque: Le stockage sur disque utilise le codage UTF-8 .
OCTETS
Indique que les octets sont les unités de l'opération. OCTETS est souvent utilisé lorsqu'une application est intéressée par l'allocation d'espace tampon ou lorsque les opérations doivent utiliser un traitement d'octets simple.

La longueur calculée d'une chaîne calculée à l'aide de OCTETS (octets) peut différer de celle calculée à l'aide de CODEUNITS16 ou CODEUNITS32. Lorsque vous utilisez OCTETS, la longueur de la chaîne est déterminée en comptant simplement le nombre d'octets dans la chaîne. Lorsque vous utilisez CODEUNITS16 ou CODEUNITS32, la longueur de la chaîne est déterminée en comptant le nombre d'unités de code 16 bits ou 32 bits nécessaires pour représenter la chaîne en UTF-16 ou UTF-32. Une longueur déterminée à l'aide de CODEUNITS16 et CODEUNITS32 est identique sauf si les données contiennent des caractères supplémentaires (voir Différence entre CODEUNITS16 et CODEUNITS32).

Par exemple, supposons que NAME, une colonne VARCHAR (128) codée en Unicode UTF-8, contient la valeur'Jürgen'. Les deux requêtes suivantes, qui comptent la longueur de la chaîne dans CODEUNITS16 ou CODEUNITS32, renvoient la même valeur (6).
   SELECT CHARACTER_LENGTH(NAME,CODEUNITS16) FROM T1
     WHERE NAME = 'Jürgen'

   SELECT CHARACTER_LENGTH(NAME,CODEUNITS32) FROM T1
     WHERE NAME = 'Jürgen'
La requête suivante, qui compte la longueur de la chaîne en OCTETS, renvoie la valeur 7.
   SELECT CHARACTER_LENGTH(NAME,OCTETS) FROM T1
     WHERE NAME = 'Jürgen'
Ces valeurs représentent la longueur de la chaîne exprimée dans l'unité de chaîne spécifiée.
Le tableau suivant présente les représentations UTF-8, UTF-16BE (big-endian)et UTF-32BE (big-endian) du nom'Jürgen':
Format    Representation of the name 'Jürgen'
--------  --------------------------------------
UTF-8	  X'4AC3BC7267656E'
UTF-16BE 	X'004A00FC007200670065006E'
UTF-32BE 	X'0000004A000000FC0000007200000067000000650000006E'
La représentation du caractère "ü" diffère entre les trois unités de chaîne:
  • La représentation UTF-8 du caractère'ü'est X'C3BC'.
  • La représentation UTF-16BE du caractère'ü'est X'00FC'.
  • La représentation UTF-32BE du caractère'ü'est X'000000FC'.

La spécification d'unités de chaîne pour une fonction intégrée n'affecte pas le type de données, les unités de chaîne ou la page de codes du résultat de la fonction. Si nécessaire, les données sont converties en Unicode pour évaluation lorsque CODEUNITS16 ou CODEUNITS32 est spécifié.

Lorsque OCTETS est spécifié pour la fonction LOCATE ou POSITION et que les pages de codes des arguments de chaîne sont différentes, les données sont converties dans la page de codes de l'argument source-string . Dans ce cas, le résultat de la fonction se trouve dans la page de codes de l'argument source-string . Lorsque OCTETS est spécifié pour les fonctions qui prennent un seul argument de chaîne, les données sont évaluées dans la page de codes de l'argument de chaîne et le résultat de la fonction est dans la page de codes de l'argument de chaîne.

Différence entre CODEUNITS16 et CODEUNITS32

Lorsque CODEUNITS16 ou CODEUNITS32 est spécifié, le résultat est le même, sauf lorsque les données contiennent des caractères Unicode supplémentaires. En effet, un caractère supplémentaire est représenté par deux unités de code UTF-16 ou une unité de code UTF-32 . Dans UTF-8, un caractère non supplémentaire est représenté par 1 à 3 octets et un caractère supplémentaire par 4 octets. En UTF-16, un caractère non supplémentaire est représenté par une unité de code CODEUNITS16 ou 2 octets, et un caractère supplémentaire est représenté par deux unités de code CODEUNITS16 ou 4 octets. En UTF-32, un caractère est représenté par une unité de code CODEUNITS32 ou 4 octets.

Par exemple, le tableau suivant présente les valeurs hexadécimales pour la majuscule mathématique A et la majuscule latine A. La majuscule mathématique en gras A est un caractère supplémentaire représenté par 4 octets en UTF-8, UTF-16et UTF-32.
Caractère Représentation UTF-8 Représentation UTF-16BE Représentation UTF-32BE
Valeur Unicode X'1D400' -'A'; majuscule mathématique en gras A X'F09D9080' X'D835DC00' X'0001D400'
Valeur Unicode X'0041' -'A'; majuscule latine A X'41' X'0041' X'00000041'
Supposons que C1 est une colonne VARCHAR (128), codée en Unicode UTF-8, et que la table T1 contient une ligne avec la valeur de la majuscule mathématique en gras A (X'F09D9080'). Les requêtes suivantes renvoient des résultats différents:
Query                                                Returns
-----                                                -------
SELECT CHARACTER_LENGTH(C1,CODEUNITS16) FROM T1      2

SELECT CHARACTER_LENGTH(C1,CODEUNITS32) FROM T1      1

SELECT CHARACTER_LENGTH(C1,OCTETS) FROM T1           4