sql >> Database >  >> RDS >> Mysql

Hoe de WEIGHT_STRING()-functie werkt in MySQL

In MySQL is de WEIGHT_STRING() functie retourneert de gewichtsreeks voor de invoerreeks. De geretourneerde waarde is een binaire tekenreeks die de vergelijkings- en sorteerwaarde van de tekenreeks vertegenwoordigt.

Als de invoertekenreeks een niet-binaire waarde is, bevat de geretourneerde waarde de sorteergewichten voor de tekenreeks. Als het een binaire waarde is, is het resultaat hetzelfde als de invoertekenreeks. Dit komt omdat het gewicht voor elke byte in een binaire string de bytewaarde is.

Deze functie is een foutopsporingsfunctie bedoeld voor intern gebruik. Het kan worden gebruikt voor het testen en debuggen van sorteringen. Merk op dat het gedrag tussen MySQL-versies kan veranderen.

Syntaxis

De syntaxis gaat als volgt:

WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [flags])

Waar str is de invoerreeks. De optionele AS clausule stelt u in staat om de invoerreeks naar een bepaald type en een bepaalde lengte te casten. De optionele flags argument wordt momenteel niet gebruikt in MySQL (vanaf versie 8.0).

Voorbeeld 1 – Basisgebruik

Hier is een basisvoorbeeld van gebruik met een niet-binaire invoerreeks:

SELECT HEX(WEIGHT_STRING('Cat'));

Resultaat:

+---------------------------+
| HEX(WEIGHT_STRING('Cat')) |
+---------------------------+
| 1C7A1C471E95              |
+---------------------------+

Merk op dat ik de HEX() . gebruik functie om de WEIGHT_STRING() . weer te geven resultaat. Dit komt omdat WEIGHT_STRING() geeft een binair resultaat. We kunnen HEX() . gebruiken om het resultaat in een afdrukbare vorm weer te geven.

Als ik HEX() niet gebruik in dit voorbeeld krijg ik dit:

SELECT WEIGHT_STRING('Cat');

Resultaat:

+----------------------+
| WEIGHT_STRING('Cat') |
+----------------------+
| zG?                |
+----------------------+

Dus voor de duidelijkheid, hier is de string, de hexadecimale weergave van die string en de hexadecimale weergave van de gewichtsstring:

SET @str = 'Cat';
SELECT @str, HEX(@str), HEX(WEIGHT_STRING(@str));

Resultaat:

+------+-----------+--------------------------+
| @str | HEX(@str) | HEX(WEIGHT_STRING(@str)) |
+------+-----------+--------------------------+
| Cat  | 436174    | 1C7A1C471E95             |
+------+-----------+--------------------------+

Voorbeeld 2 – De AS-clausule

Hier is een voorbeeld met de AS clausule om de invoerstring naar een bepaald type en lengte te casten.

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';

Resultaat:

+--------------+--------------+----------+------------------+
| Char 3       | Char 8       | Binary 3 | Binary 8         |
+--------------+--------------+----------+------------------+
| 1C7A1C471E95 | 1C7A1C471E95 | 436174   | 4361740000000000 |
+--------------+--------------+----------+------------------+

Voorbeeld 3 – Sorteren

De volgende twee voorbeelden laten zien hoe een string een ander gewicht kan hebben, afhankelijk van de gebruikte sortering. De sortering die in het eerste voorbeeld wordt gebruikt, is accentongevoelig en hoofdletterongevoelig. De sortering die in het tweede voorbeeld wordt gebruikt, is accentgevoelig en hoofdlettergevoelig.

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));

Resultaat:

+--------+--------+---------------+
| String | Hex    | Weight String |
+--------+--------+---------------+
| CAT    | 434154 | 1C7A1C471E95  |
| cat    | 636174 | 1C7A1C471E95  |
+--------+--------+---------------+

En hier is hetzelfde voorbeeld, behalve met een accentgevoelige en hoofdlettergevoelige sortering.

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));

Resultaat:

+--------+--------+----------------------------------------------+
| String | Hex    | Weight String                                |
+--------+--------+----------------------------------------------+
| CAT    | 434154 | 1C7A1C471E9500000020002000200000000800080008 |
| cat    | 636174 | 1C7A1C471E9500000020002000200000000200020002 |
+--------+--------+----------------------------------------------+

  1. Azure Virtual Machines voor gebruik van SQL Server

  2. null vs lege string in Oracle

  3. MariaDB DEFAULT() Uitgelegd

  4. Hoe SQL-query's te versnellen