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

Codages des jeux de caractères et facteurs de taille de stockage

À moins que vous ne soyez intéressé que par le changement maximum, votre exemple n'est pas correct.

AL32UTF8 est un jeu de caractères de longueur variable. De manière générale, tout caractère du jeu de caractères US7ASCII prendra 1 octet, les caractères européens nécessiteront généralement 2 octets, divers caractères de langues asiatiques nécessiteront 3 octets et une poignée de caractères très rares nécessiteront 4 octets. De manière réaliste, si vous parlez de convertir des données réelles WE8ISO8859P1 en AL32UTF8, vous verrez généralement en pratique un facteur de conversion entre 1 et 2 qui est beaucoup plus proche de 1 que de 2. Sans rechercher le mappage Unicode pour chaque caractère WE8ISO8859P1 valide , je serais surpris si 3 ou 4 octets de stockage étaient requis dans le jeu de caractères AL32UTF8.

Dans le Globalization Support Guide, il y a une section sur jeux de caractères qui vous indique quels jeux de caractères sont à un octet, lesquels sont à plusieurs octets et lesquels des jeux de caractères à plusieurs octets sont à largeur fixe. Presque tous les jeux de caractères multi-octets ont une largeur variable, donc le facteur que vous recherchez dépendra de vos données.

Dans la plupart des cas, vous feriez mieux de déclarer vos colonnes pour utiliser la sémantique de longueur de caractère plutôt que la sémantique de longueur d'octet de toute façon, laissant la base de données déterminer en arrière-plan la quantité de données à allouer. Par exemple, si vous déclarez une colonne

CREATE TABLE foo (
  col1 VARCHAR2(10 CHAR)
)

Oracle allouera de l'espace pour 10 caractères de stockage quel que soit le jeu de caractères de la base de données et quel que soit le nombre réel d'octets requis pour stocker ces données (sous réserve de la limite de 4000 octets par VARCHAR2 colonne). Cela facilite généralement la définition des tailles de colonne car vous n'avez pas à surdimensionner les colonnes au cas où quelqu'un déciderait de lancer 10 caractères UTF-8 à 4 octets dans une ligne et vous n'avez pas à expliquer aux utilisateurs que la colonne acceptera chaînes de nombres de caractères différents selon la langue et/ou les caractères spécifiques choisis.

Bien que les gens d'Oracle qui traitent régulièrement de la mondialisation la découragent , préférant que vous spécifiiez explicitement la sémantique de la longueur des caractères lorsque vous déclarez vos colonnes ou au moins ne la définissiez qu'au niveau de la session, vous pouvez définir le NLS_LENGTH_SEMANTICS paramètre d'initialisation pour provoquer VARCHAR2(10) pour utiliser la sémantique de longueur de caractère plutôt que la sémantique de longueur d'octet par défaut (vous pouvez toujours spécifier VARCHAR2(10 BYTE) si vous voulez une sémantique de longueur en octets).