Présentation

SQLite permet les caractères NUL (ASCII 0x00, Unicode \u0000) au milieu des valeurs de chaîne stockées dans la base de données. Cependant, l'utilisation de NUL dans les chaînes peut entraîner des comportements surprenants.

Fonctionnement

La fonction SQL length() ne compte que les caractères jusqu'au premier NUL. La fonction quote() ne montre que les caractères jusqu'au premier NUL. La commande .dump dans l'interface de ligne de commande omet le premier caractère NUL et tout le texte suivant dans la sortie SQL qu'elle génère.

CREATE TABLE t1(a INTEGER PRIMARY KEY, b TEXT); INSERT INTO t1(a,b) VALUES(1, 'abc'||char(0)||'xyz'); SELECT a, b, length(b) FROM t1;

Ceci montre la sortie : 1, 'abc', 3. Mais si vous exécutez : SELECT * FROM t1 WHERE b='abc'; Alors aucune ligne n'est retournée. SQLite sait que la colonne t1.b contient réellement une chaîne de 7 caractères, et la chaîne de 7 caractères 'abc'||char(0)||'xyz' n'est pas égale à la chaîne de 3 caractères 'abc'.

Implications et limites

Si vous castez une chaîne en BLOB, alors la longueur totale de la chaîne est affichée. Par exemple : SELECT a, CAST(b AS BLOB) FROM t1; Cela donne le résultat : 1, X'6162630078797a'. Dans la sortie BLOB, vous pouvez clairement voir le caractère NUL comme le 4ème caractère de la chaîne de 7 caractères.

SELECT a, CAST(b AS BLOB) FROM t1;

Analyse scientifique

Pour détecter si une valeur de chaîne X contient des caractères NUL intégrés, vous pouvez utiliser une expression comme : instr(X, char(0)). Si cette expression renvoie une valeur non nulle N, alors il existe un NUL intégré à la position du caractère N. Ainsi, pour compter le nombre de lignes qui contiennent des caractères NUL intégrés : SELECT count(*) FROM t1 WHERE instr(b, char(0)) > 0;