sql >> Database >  >> RDS >> MariaDB

Hoe WEIGHT_STRING() werkt in MariaDB

In MariaDB, WEIGHT_STRING() is een ingebouwde functie die de gewichtsreeks voor de invoerreeks retourneert. 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 het sorteergewicht van 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.

Syntaxis

De syntaxis gaat als volgt:

WEIGHT_STRING(str [AS {CHAR|BINARY}(N)] [LEVEL levels] [flags])
  levels: N [ASC|DESC|REVERSE] [, N [ASC|DESC|REVERSE]] ... 

Hieronder vindt u een beschrijving van elk argument/clausule.

De AS Clausule

De optionele AS clausule staat het casten van de invoerreeks toe naar een binaire of niet-binaire reeks, evenals naar een bepaalde lengte.

  • AS BINARY(N) meet de lengte in bytes in plaats van tekens, en rechterpads met 0x00 bytes tot de gewenste lengte.
  • AS CHAR(N) meet de lengte in karakters, en rechter pads met spaties tot de gewenste lengte.

N heeft een minimumwaarde van 1 , en als deze kleiner is dan de lengte van de invoertekenreeks, wordt de tekenreeks zonder waarschuwing afgekapt.

Het LEVEL Clausule

Specificeert dat de retourwaarde gewichten moet bevatten voor specifieke sorteringsniveaus.

De levels specificatie kan een enkel geheel getal zijn, een door komma's gescheiden lijst van gehele getallen of een reeks gehele getallen gescheiden door een streepje (spatie wordt genegeerd). Gehele getallen kunnen variëren van 1 tot een maximum van 6 , afhankelijk van de sortering, en moeten in oplopende volgorde worden weergegeven.

  • Als het LEVEL clausule is niet voorzien, een standaard van 1 tot het maximum voor de sortering wordt aangenomen.
  • Als het LEVEL is opgegeven zonder een bereik te gebruiken, is een optionele modifier toegestaan.
  • ASC (de standaardinstelling) retourneert de gewichten zonder enige wijziging.
  • DESC retourneert bitsgewijze omgekeerde gewichten.
  • REVERSE geeft de gewichten in omgekeerde volgorde terug.

Voorbeeld

Hier is een eenvoudig voorbeeld:

SELECT HEX(WEIGHT_STRING('z'));

Resultaat:

+-------------------------+
| HEX(WEIGHT_STRING('z')) |
+-------------------------+
| 005A                    |
+-------------------------+

Hier gebruiken we de HEX() functie om niet-afdrukbare resultaten in hexadecimaal formaat weer te geven.

De AS Clausule

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

SET @str = 'z';
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 (met verticale uitvoer):

  Char 3: 005A00200020
  Char 8: 005A0020002000200020002000200020
Binary 3: 7A0000
Binary 8: 7A00000000000000

Collatie

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 niet hoofdlettergevoelig. De sortering die in het tweede voorbeeld wordt gebruikt, is hoofdlettergevoelig.

SET @upper = _latin1 'PLAY' COLLATE latin1_general_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 |
+--------+----------+---------------+
| PLAY   | 504C4159 | 8F7941AA      |
| play   | 706C6179 | 8F7941AA      |
+--------+----------+---------------+

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

SET @upper = _latin1 'PLAY' COLLATE latin1_general_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 |
+--------+----------+---------------+
| PLAY   | 504C4159 | 8F7941AA      |
| play   | 706C6179 | 907A42AB      |
+--------+----------+---------------+

Nullargumenten

Doorgeven van null retourneert null :

SELECT WEIGHT_STRING(null);

Resultaat:

+---------------------+
| WEIGHT_STRING(null) |
+---------------------+
| NULL                |
+---------------------+

Ontbrekende argumenten

WEIGHT_STRING() . aanroepen met het verkeerde aantal argumenten, of zonder het doorgeven van argumenten resulteert in een fout:

SELECT WEIGHT_STRING();

Resultaat:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ')' at line 1

  1. ORA-28000:het account is vergrendeld, fout wordt vaak weergegeven

  2. Oracle naar PostgreSQL:BEGIN MET/VERBIND DOOR

  3. Verticaal schalen PostgreSQL

  4. Hoe BIN() werkt in MariaDB