No MySQL, o
JSON_UNQUOTE()
a função "sem aspas" um documento JSON e retorna o resultado como um utf8mb4
fragmento. Você fornece o documento JSON como um argumento e a função fará o resto.
Sintaxe
A sintaxe fica assim:
JSON_UNQUOTE(json_val)
Onde
json_val
é o documento JSON que você deseja sem aspas. Exemplo
Aqui está um exemplo para demonstrar.
SET @data = '"Homer Simpson"'; SELECT @data Original, JSON_UNQUOTE(@data) Unquoted;
Resultado:
+-----------------+---------------+ | Original | Unquoted | +-----------------+---------------+ | "Homer Simpson" | Homer Simpson | +-----------------+---------------+
Caracteres de escape
A forma como esta função trata os caracteres de escape depende se
NO_BACKSLASH_ESCAPES
está habilitado ou desabilitado. Quando NO_BACKSLASH_ESCAPES está desabilitado
O
NO_BACKSLASH_ESCAPES
O modo está desabilitado por padrão no MySQL 8.0. Veja o que acontece se incluirmos
\t
para especificar um caractere de tabulação em uma string quando NO_BACKSLASH_ESCAPES
está desativado e sem usando JSON_UNQUOTE()
. SET @data = '"Homer \t Simpson"'; SELECT @data Original;
Resultado:
+-------------------+ | Original | +-------------------+ | "Homer Simpson" | +-------------------+
E aqui está o que acontece se usarmos
JSON_UNQUOTE()
:SET @data = '"Homer \t Simpson"'; SELECT JSON_UNQUOTE(@data) Unquoted;
Resultado:
ERROR 3141 (22032): Invalid JSON text in argument 1 to function json_unquote: "Invalid escape character in string." at position 7.
Podemos superar isso usando duas barras invertidas (
\\t
). No entanto, lembre-se de que isso mudará o resultado quando não usando JSON_UNQUOTE()
. SET @data = '"Homer \\t Simpson"'; SELECT @data Original, JSON_UNQUOTE(@data) Unquoted;
Resultado:
+--------------------+-----------------+ | Original | Unquoted | +--------------------+-----------------+ | "Homer \t Simpson" | Homer Simpson | +--------------------+-----------------+
Quando NO_BACKSLASH_ESCAPES está ativado
Veja o que acontece quando ativamos
NO_BACKSLASH_ESCAPES
antes de executar a instrução anterior:SET @@sql_mode = 'NO_BACKSLASH_ESCAPES'; SET @data = '"Homer \\t Simpson"'; SELECT @data Original, JSON_UNQUOTE(@data) Unquoted;
Resultado:
+---------------------+------------------+ | Original | Unquoted | +---------------------+------------------+ | "Homer \\t Simpson" | Homer \t Simpson | +---------------------+------------------+
E aqui está o que acontece se removermos a primeira barra invertida:
SET @@sql_mode = 'NO_BACKSLASH_ESCAPES'; SET @data = '"Homer \t Simpson"'; SELECT @data Original, JSON_UNQUOTE(@data) Unquoted;
Resultado:
+--------------------+-----------------+ | Original | Unquoted | +--------------------+-----------------+ | "Homer \t Simpson" | Homer Simpson | +--------------------+-----------------+