En MySQL, JSON_UNQUOTE()
la función "elimina las comillas" de un documento JSON y devuelve el resultado como utf8mb4
cadena.
Proporcionas el documento JSON como argumento y la función hará el resto.
Sintaxis
La sintaxis es así:
JSON_UNQUOTE(json_val)
Donde json_val
es el documento JSON que desea sin comillas.
Ejemplo
Aquí hay un ejemplo para demostrarlo.
SET @data = '"Homer Simpson"'; SELECT @data Original, JSON_UNQUOTE(@data) Unquoted;
Resultado:
+-----------------+---------------+ | Original | Unquoted | +-----------------+---------------+ | "Homer Simpson" | Homer Simpson | +-----------------+---------------+
Personajes de escape
La forma en que esta función maneja los caracteres de escape depende de si NO_BACKSLASH_ESCAPES
está habilitado o deshabilitado.
Cuando NO_BACKSLASH_ESCAPES está deshabilitado
El NO_BACKSLASH_ESCAPES
el modo está deshabilitado por defecto en MySQL 8.0.
Esto es lo que sucede si incluimos \t
para especificar un carácter de tabulación dentro de una cadena cuando NO_BACKSLASH_ESCAPES
está deshabilitado y sin usando JSON_UNQUOTE()
.
SET @data = '"Homer \t Simpson"'; SELECT @data Original;
Resultado:
+-------------------+ | Original | +-------------------+ | "Homer Simpson" | +-------------------+
Y esto es lo que sucede si usamos 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 solucionar esto usando dos barras invertidas (\\t
). Sin embargo, tenga en cuenta que hacer esto cambiará el resultado cuando no usando JSON_UNQUOTE()
.
SET @data = '"Homer \\t Simpson"'; SELECT @data Original, JSON_UNQUOTE(@data) Unquoted;
Resultado:
+--------------------+-----------------+ | Original | Unquoted | +--------------------+-----------------+ | "Homer \t Simpson" | Homer Simpson | +--------------------+-----------------+
Cuando NO_BACKSLASH_ESCAPES está habilitado
Esto es lo que sucede cuando habilitamos NO_BACKSLASH_ESCAPES
antes de ejecutar la sentencia 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 | +---------------------+------------------+
Y esto es lo que sucede si eliminamos la primera 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 | +--------------------+-----------------+