I MySQL er WEIGHT_STRING()
funktion returnerer vægtstrengen for inputstrengen. Returværdien er en binær streng, der repræsenterer strengens sammenlignings- og sorteringsværdi.
Hvis inputstrengen er en ikke-binær værdi, indeholder returværdien sorteringsvægtene for strengen. Hvis det er en binær værdi, er resultatet det samme som inputstrengen. Dette skyldes, at vægten for hver byte i en binær streng er byteværdien.
Denne funktion er en fejlfindingsfunktion beregnet til intern brug. Det kan bruges til test og fejlfinding af kollationer. Bemærk, at dens adfærd kan ændre sig mellem MySQL-versioner.
Syntaks
Syntaksen ser sådan ud:
WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])
Hvor str
er inputstrengen. Den valgfri AS
klausul giver dig mulighed for at caste inputstrengen til en given type og længde. De valgfrie flags
argument bruges i øjeblikket ikke i MySQL (fra version 8.0).
Eksempel 1 – Grundlæggende brug
Her er et grundlæggende eksempel på brug af en ikke-binær inputstreng:
SELECT HEX(WEIGHT_STRING('Cat'));
Resultat:
+---------------------------+ | HEX(WEIGHT_STRING('Cat')) | +---------------------------+ | 1C7A1C471E95 | +---------------------------+
Bemærk, at jeg bruger HEX()
funktion for at vise WEIGHT_STRING()
resultat. Dette er fordi WEIGHT_STRING()
returnerer et binært resultat. Vi kan bruge HEX()
for at vise resultatet i en udskrivbar form.
Hvis jeg ikke bruger HEX()
i dette eksempel får jeg dette:
SELECT WEIGHT_STRING('Cat');
Resultat:
+----------------------+ | WEIGHT_STRING('Cat') | +----------------------+ | zG? | +----------------------+
Så bare for at være klar, her er strengen, den hexadecimale repræsentation af den streng og den hexadecimale repræsentation af dens vægtstreng:
SET @str = 'Cat'; SELECT @str, HEX(@str), HEX(WEIGHT_STRING(@str));
Resultat:
+------+-----------+--------------------------+ | @str | HEX(@str) | HEX(WEIGHT_STRING(@str)) | +------+-----------+--------------------------+ | Cat | 436174 | 1C7A1C471E95 | +------+-----------+--------------------------+
Eksempel 2 – AS-klausulen
Her er et eksempel, der bruger AS
klausul for at caste inputstrengen til en given type og længde.
SET @str = 'Cat'; SELECT HEX(WEIGHT_STRING(@str AS CHAR(3))) 'Char 3', HEX(WEIGHT_STRING(@str AS CHAR(8))) 'Char 8', HEX(WEIGHT_STRING(@str AS BINARY(3))) 'Binary 3', HEX(WEIGHT_STRING(@str AS BINARY(8))) 'Binary 8';
Resultat:
+--------------+--------------+----------+------------------+ | Char 3 | Char 8 | Binary 3 | Binary 8 | +--------------+--------------+----------+------------------+ | 1C7A1C471E95 | 1C7A1C471E95 | 436174 | 4361740000000000 | +--------------+--------------+----------+------------------+
Eksempel 3 – Sortering
De følgende to eksempler viser, hvordan en streng kan have en anden vægtstreng, afhængigt af den anvendte sortering. Den sortering, der blev brugt i det første eksempel, er accentufølsom og case-ufølsom. Den sortering, der bruges i det andet eksempel, er accentfølsom og skelner mellem store og små bogstaver.
SET @upper = _utf8mb4 'CAT' COLLATE utf8mb4_0900_ai_ci; SET @lower = lcase(@upper); SELECT @upper 'String', HEX(@upper) 'Hex', HEX(WEIGHT_STRING(@upper)) 'Weight String' UNION ALL SELECT @lower, HEX(@lower), HEX(WEIGHT_STRING(@lower));
Resultat:
+--------+--------+---------------+ | String | Hex | Weight String | +--------+--------+---------------+ | CAT | 434154 | 1C7A1C471E95 | | cat | 636174 | 1C7A1C471E95 | +--------+--------+---------------+
Og her er det samme eksempel, undtagen med en accentfølsom og store og små bogstaver.
SET @upper = _utf8mb4 'CAT' COLLATE utf8mb4_0900_as_cs; SET @lower = lcase(@upper); SELECT @upper 'String', HEX(@upper) 'Hex', HEX(WEIGHT_STRING(@upper)) 'Weight String' UNION ALL SELECT @lower, HEX(@lower), HEX(WEIGHT_STRING(@lower));
Resultat:
+--------+--------+----------------------------------------------+ | String | Hex | Weight String | +--------+--------+----------------------------------------------+ | CAT | 434154 | 1C7A1C471E9500000020002000200000000800080008 | | cat | 636174 | 1C7A1C471E9500000020002000200000000200020002 | +--------+--------+----------------------------------------------+