В MySQL, JSON_UNQUOTE()
функцията „отменя кавички“ JSON документ и връща резултата като utf8mb4
низ.
Вие предоставяте JSON документа като аргумент, а функцията ще направи останалото.
Синтаксис
Синтаксисът е така:
JSON_UNQUOTE(json_val)
Където json_val
е JSON документът, който не искате да цитирате.
Пример
Ето пример за демонстрация.
SET @data = '"Homer Simpson"'; SELECT @data Original, JSON_UNQUOTE(@data) Unquoted;
Резултат:
+-----------------+---------------+ | Original | Unquoted | +-----------------+---------------+ | "Homer Simpson" | Homer Simpson | +-----------------+---------------+
Escape символи
Начинът, по който тази функция обработва escape знаците зависи от това дали NO_BACKSLASH_ESCAPES
е активирана или деактивирана.
Когато NO_BACKSLASH_ESCAPES е деактивиран
NO_BACKSLASH_ESCAPES
режимът е деактивиран по подразбиране в MySQL 8.0.
Ето какво се случва, ако включим \t
за да посочите табулатор в низ, когато NO_BACKSLASH_ESCAPES
е деактивиран и без използвайки JSON_UNQUOTE()
.
SET @data = '"Homer \t Simpson"'; SELECT @data Original;
Резултат:
+-------------------+ | Original | +-------------------+ | "Homer Simpson" | +-------------------+
И ето какво се случва, ако използваме JSON_UNQUOTE()
:
SET @data = '"Homer \t Simpson"'; SELECT JSON_UNQUOTE(@data) Unquoted;
Резултат:
ERROR 3141 (22032): Invalid JSON text in argument 1 to function json_unquote: "Invalid escape character in string." at position 7.
Можем да преодолеем това, като използваме две обратни наклонени черти (\\t
). Имайте предвид обаче, че това ще промени резултата, когато не използвайки JSON_UNQUOTE()
.
SET @data = '"Homer \\t Simpson"'; SELECT @data Original, JSON_UNQUOTE(@data) Unquoted;
Резултат:
+--------------------+-----------------+ | Original | Unquoted | +--------------------+-----------------+ | "Homer \t Simpson" | Homer Simpson | +--------------------+-----------------+
Когато NO_BACKSLASH_ESCAPES е активиран
Ето какво се случва, когато активираме NO_BACKSLASH_ESCAPES
преди да изпълните предишния оператор:
SET @@sql_mode = 'NO_BACKSLASH_ESCAPES'; SET @data = '"Homer \\t Simpson"'; SELECT @data Original, JSON_UNQUOTE(@data) Unquoted;
Резултат:
+---------------------+------------------+ | Original | Unquoted | +---------------------+------------------+ | "Homer \\t Simpson" | Homer \t Simpson | +---------------------+------------------+
И ето какво се случва, ако премахнем първата обратна наклонена черта:
SET @@sql_mode = 'NO_BACKSLASH_ESCAPES'; SET @data = '"Homer \t Simpson"'; SELECT @data Original, JSON_UNQUOTE(@data) Unquoted;
Резултат:
+--------------------+-----------------+ | Original | Unquoted | +--------------------+-----------------+ | "Homer \t Simpson" | Homer Simpson | +--------------------+-----------------+