2017-10-19 52 views
4

Après avoir lu la documentation, j'ai compris qu'il y avait un préfixe de longueur d'un octet ou de deux octets à un caractère variable afin de déterminer sa longueur. Je comprends aussi que, pour un varchar, chaque caractère peut avoir une longueur différente en octets selon le caractère lui-même.Comment SQL détermine-t-il la longueur d'un caractère dans un varchar?

Ma question est la suivante:

Comment le SGBD déterminent la longueur de chaque personnage une fois qu'il est stocké?

Signification: Après une chaîne est stockée, disons ses 4 caractères, et supposons que le premier caractère est 1 octet long, le second 2 octets, les 3 3e octets et le 4 est 4 .. Comment la DB sait combien de temps chaque caractère récupère-t-il la chaîne pour la lire correctement?

J'espère que la question est claire, désolé pour les erreurs anglaises que j'ai faites. Merci

Répondre

2

La façon dont UTF-8 fonctionne comme un codage de longueur variable est que les caractères de 1 octet ne peuvent utiliser que 7 bits de cet octet.

Si le bit haut est 0, alors l'octet est un caractère de 1 octet (codé de la même manière que les 128 caractères ASCII).

Si le bit haut est 1, alors il s'agit d'un caractère multi-octets.

enter image description here

Photo de https://en.wikipedia.org/wiki/UTF-8

+0

Cela explique. Merci :) – lelbil

2

Si vous parlez de l'UTF-8, ce n'est pas tout à fait comme ça que ça fonctionne. Il utilise le bit le plus élevé de chaque octet pour indiquer que le caractère continue dans l'octet suivant et peut stocker des caractères un, deux, trois ou quatre octets assez efficacement. Ceci est en contraste avec UTF-32 où chaque caractère est automatiquement de quatre octets, ce qui est évidemment très inutile pour certains types de texte. Lorsque vous utilisez UTF-8, ou tout jeu de caractères où les caractères sont un nombre variable d'octets, il existe une déconnexion entre la longueur de la chaîne en octets et la longueur de la chaîne en caractères. Dans un système de longueur fixe comme Latin1, qui est rigidement 8 bits, il n'y a pas de telle dérive.

En interne, la base de données est le plus concerné par la longueur d'un champ en termes d'octets. La longueur en termes de caractères n'est explicitement exposée que lors de l'appel de fonctions telles que LENGTH(), sinon ce n'est qu'un paquet d'octets qui, si nécessaire, peut être interprété comme une chaîne.

Historiquement, la base de données stockait la longueur d'un champ en octets dans un seul octet, puis les données elles-mêmes. C'est pourquoi VARCHAR(255) est si répandue: C'est la plus longue chaîne que vous pouvez représenter avec un seul champ de longueur d'octet. Les bases de données plus récentes, telles que Postgres, autorisent des champs de caractères> 2 Go, de sorte qu'ils utilisent quatre octets ou plus pour représenter la longueur.