MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

Como WEIGHT_STRING() funciona no MariaDB


No MariaDB, WEIGHT_STRING() é uma função interna que retorna a string de peso para a string de entrada. O valor de retorno é uma string binária que representa a comparação e o valor de classificação da string.

Se a string de entrada for um valor não binário, o valor de retorno conterá o peso de agrupamento da string. Se for um valor binário, o resultado é o mesmo que a string de entrada. Isso ocorre porque o peso de cada byte em uma string binária é o valor do byte.

Esta função é uma função de depuração destinada ao uso interno. Ele pode ser usado para testar e depurar agrupamentos.

Sintaxe


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

Abaixo está uma descrição de cada argumento/cláusula.

O AS Cláusula


O opcional AS A cláusula permite converter a string de entrada em uma string binária ou não binária, bem como em um comprimento específico.
  • AS BINARY(N) mede o comprimento em bytes em vez de caracteres, e preenche a direita com 0x00 bytes até o comprimento desejado.
  • AS CHAR(N) mede o comprimento em caracteres e pads à direita com espaços até o comprimento desejado.

N tem um valor mínimo de 1 , e se for menor que o comprimento da string de entrada, a string será truncada sem aviso.

O LEVEL Cláusula


Especifica que o valor de retorno deve conter pesos para níveis de agrupamento específicos.

Os levels especificador pode ser um único inteiro, uma lista de inteiros separados por vírgula ou um intervalo de inteiros separados por um traço (espaço em branco é ignorado). Os inteiros podem variar de 1 até um máximo de 6 , dependendo do agrupamento, e precisam ser listados em ordem crescente.
  • Se o LEVEL cláusula não é fornecida, um padrão de 1 ao máximo para o agrupamento é assumido.
  • Se o LEVEL for especificado sem usar um intervalo, um modificador opcional é permitido.
  • ASC (o padrão) retorna os pesos sem nenhuma modificação.
  • DESC retorna pesos invertidos bit a bit.
  • REVERSE retorna os pesos na ordem inversa.

Exemplo


Segue um exemplo básico:
SELECT HEX(WEIGHT_STRING('z'));

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

Aqui, usamos o HEX() função para representar resultados não imprimíveis em formato hexadecimal.

O AS Cláusula


Aqui está um exemplo usando o AS cláusula para converter a string de entrada para um determinado tipo e comprimento.
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 saída vertical):
  Char 3: 005A00200020
  Char 8: 005A0020002000200020002000200020
Binary 3: 7A0000
Binary 8: 7A00000000000000

Agrupamento


Os dois exemplos a seguir demonstram como uma string pode ter uma string de peso diferente, dependendo do agrupamento que está sendo usado.

A ordenação usada no primeiro exemplo não diferencia maiúsculas de minúsculas. A ordenação usada no segundo exemplo faz distinção entre maiúsculas e 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      |
+--------+----------+---------------+

E aqui está o mesmo exemplo, exceto com um agrupamento que diferencia maiúsculas de 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


Passando null retorna null :
SELECT WEIGHT_STRING(null);

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

Argumentos ausentes


Chamando WEIGHT_STRING() com o número errado de argumentos ou sem passar nenhum argumento resulta em um erro:
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