sql >> Base de Datos >  >> RDS >> Mysql

Cómo funciona la función WEIGHT_STRING() en MySQL

En MySQL, el WEIGHT_STRING() La función 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 los pesos 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 utilizar para probar y depurar intercalaciones. Tenga en cuenta que su comportamiento puede cambiar entre las versiones de MySQL.

Sintaxis

La sintaxis es así:

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

Donde str es la cadena de entrada. El AS opcional La cláusula le permite convertir la cadena de entrada a un tipo y longitud determinados. Las flags opcionales El argumento no se usa actualmente en MySQL (a partir de la versión 8.0).

Ejemplo 1:uso básico

Aquí hay un ejemplo básico de uso usando una cadena de entrada no binaria:

SELECT HEX(WEIGHT_STRING('Cat'));

Resultado:

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

Tenga en cuenta que uso el HEX() función para mostrar el WEIGHT_STRING() resultado. Esto se debe a que WEIGHT_STRING() devuelve un resultado binario. Podemos usar HEX() para mostrar el resultado en forma imprimible.

Si no uso HEX() en este ejemplo obtengo esto:

SELECT WEIGHT_STRING('Cat');

Resultado:

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

Entonces, para que quede claro, aquí está la cadena, la representación hexadecimal de esa cadena y la representación hexadecimal de su cadena de peso:

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

Resultado:

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

Ejemplo 2:la cláusula AS

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

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

Resultado:

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

Ejemplo 3:Intercalació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 acentos ni mayúsculas y minúsculas. La intercalación utilizada en el segundo ejemplo distingue acentos y mayúsculas y minúsculas.

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

Resultado:

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

Y aquí está el mismo ejemplo, excepto que con una intercalación que distingue mayúsculas de minúsculas y acentos.

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

Resultado:

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