sql >> Base de Datos >  >> RDS >> MariaDB

Cómo funciona WEIGHT_STRING() en MariaDB

En MariaDB, WEIGHT_STRING() es una función integrada que devuelve la cadena de peso para la cadena de entrada. El valor de retorno es una cadena binaria que representa el valor de comparación y clasificación de la cadena.

Si la cadena de entrada es un valor no binario, el valor devuelto contiene el peso de intercalación de la cadena. Si es un valor binario, el resultado es el mismo que la cadena de entrada. Esto se debe a que el peso de cada byte en una cadena binaria es el valor del byte.

Esta función es una función de depuración diseñada para uso interno. Se puede usar para probar y depurar intercalaciones.

Sintaxis

La sintaxis es así:

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

A continuación se muestra una descripción de cada argumento/cláusula.

El AS Cláusula

El AS opcional La cláusula permite convertir la cadena de entrada en una cadena binaria o no binaria, así como en una longitud particular.

  • AS BINARY(N) mide la longitud en bytes en lugar de caracteres, y completa con 0x00 bytes hasta la longitud deseada.
  • AS CHAR(N) mide la longitud en caracteres y las almohadillas derechas con espacios hasta la longitud deseada.

N tiene un valor mínimo de 1 , y si es menor que la longitud de la cadena de entrada, la cadena se trunca sin previo aviso.

El LEVEL Cláusula

Especifica que el valor devuelto debe contener ponderaciones para niveles de intercalación específicos.

Los levels El especificador puede ser un entero único, una lista de enteros separados por comas o un rango de enteros separados por un guión (se ignoran los espacios en blanco). Los números enteros pueden variar desde 1 hasta un máximo de 6 , según la intercalación, y deben enumerarse en orden ascendente.

  • Si el LEVEL no se proporciona la cláusula, un valor predeterminado de 1 se asume el máximo para la colación.
  • Si el LEVEL se especifica sin usar un rango, se permite un modificador opcional.
  • ASC (el valor predeterminado) devuelve los pesos sin ninguna modificación.
  • DESC devuelve pesos invertidos bit a bit.
  • REVERSE devuelve los pesos en orden inverso.

Ejemplo

He aquí un ejemplo básico:

SELECT HEX(WEIGHT_STRING('z'));

Resultado:

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

Aquí, usamos el HEX() función para representar resultados no imprimibles en formato hexadecimal.

El AS Cláusula

Aquí hay un ejemplo usando el AS cláusula para convertir la cadena de entrada a un tipo y longitud determinados.

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

Resultado (usando salida vertical):

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

Colección

Los siguientes dos ejemplos demuestran cómo una cadena puede tener una cadena de peso diferente, según la intercalación que se utilice.

La intercalación utilizada en el primer ejemplo no distingue entre mayúsculas y minúsculas. La intercalación utilizada en el segundo ejemplo distingue entre mayúsculas y minúsculas.

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

Resultado:

+--------+----------+---------------+
| String | Hex      | Weight String |
+--------+----------+---------------+
| PLAY   | 504C4159 | 8F7941AA      |
| play   | 706C6179 | 8F7941AA      |
+--------+----------+---------------+

Y aquí está el mismo ejemplo, excepto que se distingue entre mayúsculas y minúsculas.

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

Resultado:

+--------+----------+---------------+
| String | Hex      | Weight String |
+--------+----------+---------------+
| PLAY   | 504C4159 | 8F7941AA      |
| play   | 706C6179 | 907A42AB      |
+--------+----------+---------------+

Argumentos nulos

Pasando null devuelve null :

SELECT WEIGHT_STRING(null);

Resultado:

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

Argumentos faltantes

Llamando a WEIGHT_STRING() con el número incorrecto de argumentos, o sin pasar ningún argumento da como resultado un error:

SELECT WEIGHT_STRING();

Resultado:

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