Oracle
 sql >> Base de données >  >> RDS >> Oracle

Longueur réelle d'une chaîne, telle qu'elle est vue par Oracle

Vous pouvez, comme d'autres l'ont montré, convertir la chaîne Java en un tableau d'octets à l'aide du jeu de caractères de la base de données Oracle, puis en obtenir la longueur en octets. Cela dépend cependant de la connaissance du jeu de caractères de votre base de données :différentes bases de données auront différents jeux de caractères, ce qui entraînera différentes longueurs d'octets pour la même chaîne dans différents jeux de caractères.

En supposant que votre base de données utilise un jeu de caractères à largeur variable comme UTF-8 (NLS_CHARACTERSET de AL32UTF8), vous pouvez également déclarer des colonnes dans Oracle en fonction de la longueur des caractères plutôt que de la longueur en octets. Cela peut simplifier votre code puisque vous pouvez simplement vérifier la longueur en caractères de votre chaîne. Cela simplifie également la communication pour les utilisateurs. Il est généralement difficile pour les utilisateurs de comprendre pourquoi un champ peut parfois stocker 5 caractères alors que d'autres fois il rejette une chaîne de 2 caractères en fonction des caractères qui font partie de la chaîne (1 caractère dans le jeu de caractères UTF-8 peut nécessiter jusqu'à 3 octets de stockage).

Par défaut, lorsque vous déclarez une colonne

CREATE TABLE foo (
  col_name VARCHAR2(5)
);

qui indique à Oracle d'autoriser jusqu'à 5 octets de données. Si vous souhaitez autoriser 5 caractères de données quel que soit le nombre d'octets, vous pouvez toutefois utiliser la sémantique de longueur de caractère

CREATE TABLE foo (
  col_name VARCHAR2(5 CHAR)
);

En supposant que vous souhaitiez le faire pour toutes vos tables lors de l'exécution de votre DDL, vous pouvez également définir nls_length_semantics au niveau de la session avant d'exécuter votre DDL

ALTER SESSION SET nls_length_semantics = CHAR;

CREATE TABLE foo (
  col_name VARCHAR2(5)
);

crée un tableau avec une colonne qui autorise jusqu'à 5 caractères de données.