web-dev-qa-db-fra.com

Vargraphic vs Varchar CodeUnits32

Je suis en train de migrer un certain nombre de bases de données d'ISO8859-1 à UTF-8. Pour adapter l'ancienne chaîne dans de nouvelles tables, j'ai pensé qu'il y a 3 options:

  1. Multipliez le nombre d'octets avec un numéro correspondant à la distribution de caractères multibytes dans le domaine et ajoutez des contraintes de vérification pour la validation de la longueur. C'est-à-dire que le char (3) pourrait devenir hypothétiquement devenu char (5).
  2. Déclarez la colonne en tant que Char (3 CodeUnits32). Pour autant que je sache, cela occupera 12 octets
  3. Déclarez la colonne comme graphique (3). Pour autant que je sache, cela occupera 6 octets.

Je ne considère pas vraiment 1 une option, qui nous laisse avec 2 et 3. Quand 2 seront préférables sur 3? Je pense avoir vu des informations sur lesquelles certains personnages peuvent ne pas correspondre correctement du caractère graphique, mais cela semble fonctionner correctement pour les personnages de ISO8859-1. Outre cela, je manque quelque chose ou que graphique serait toujours de préférence sur le code de code32?

1
Lennart

Le type de données GRAPHIC semble être un reste de l'époque où il n'y avait pas de support unicode généralisé. C'était là pour faciliter le stockage de caractères à double octet. Essentition GRAPHIC(3) équivaut à CHAR(3 CODEUNITS16).

En dehors de la sémantique de la longueur (1 octet vs. 2 caractères d'octets) (VAR)CHAR et (VAR)GRAPHIC sont fonctionnellement équivalents. Maintenant que vous avez la possibilité de spécifier les unités de longueur avec le type de données, je ne vois vraiment aucune raison d'utiliser les types GRAPHIC.

Étant donné qu'un caractère UTF-8 peut occuper n'importe où entre 1 et 4 octets, l'utilisation d'une hypothèse de caractères à nombre fixe-de-plusieurs octets entraînerait un risque de troncature ou de gaspillage d'espace. Pour éviter ce dernier, vous pourriez envisager d'utiliser VARCHAR au lieu de CHAR si votre demande peut tolérer cela.

3
mustaccio