全部产品
Search
文档中心

MaxCompute:Karakter escape

更新时间:Jun 19, 2025

Dalam MaxCompute, karakter dengan makna khusus atau yang tidak dapat dimasukkan secara langsung harus di-escape. Hal ini memastikan string direpresentasikan dan diproses secara akurat. Topik ini menjelaskan skenario penggunaan karakter escape serta memberikan contoh penerapannya dalam MaxCompute.

Skenario

Dalam pemrograman, karakter escape digunakan untuk merepresentasikan string. Metode penggunaannya serupa di berbagai konteks.

  1. Tentukan aturan untuk karakter khusus seperti ' dan ".

  2. Proses karakter khusus dengan makna tertentu atau karakter tak terlihat. Contohnya, karakter ' di-escape menjadi \', dan " menjadi \".

  3. Lakukan pemrosesan tambahan pada hasil dari langkah sebelumnya. Contohnya, gunakan \\ untuk merepresentasikan backslash.

Sebagian besar spesifikasi menggunakan backslash \ sebagai karakter escape. Berikut adalah skenario umum penggunaan backslash sebagai karakter escape.

null

Beberapa spesifikasi tidak menggunakan backslash \ sebagai karakter escape. Contohnya, dalam URL, tanda persen % digunakan sebagai karakter escape, sedangkan dalam XML, ampersand & digunakan.

MaxCompute SQL

Dalam sintaksis SQL, string harus diapit oleh tanda kutip tunggal atau ganda, seperti "abc" atau '123'. Jika string mengandung satu jenis tanda kutip, Anda dapat mengapitnya dengan jenis tanda kutip lain. Contohnya: 'Tanda kutip ganda (")'. Namun, jika teks mencakup kedua jenis tanda kutip, gunakan karakter escape. Contohnya:

Tanda kutip ganda(")
Tanda kutip tunggal(')

Kode di atas mengandung '', "", dan baris baru. Dalam kasus ini, backslash \ digunakan bersama karakter berikutnya untuk merepresentasikan satu karakter. Contohnya, \n merepresentasikan baris baru, sementara \" atau \' merepresentasikan tanda kutip ganda atau tunggal dalam string. Dengan demikian, kode di atas dapat ditulis sebagai 'Tanda kutip ganda(")\nTanda kutip tunggal(\')' atau "Tanda kutip ganda(\")\nTanda kutip tunggal(')".

Backslash memiliki makna khusus. Untuk string yang mengandung backslash, tuliskan sebagai \\. Backslash pertama bertindak sebagai karakter escape, sedangkan backslash kedua adalah karakter nyata. Tabel berikut menjelaskan sintaks umum untuk karakter escape dalam SQL.

Sintaks karakter escape

Deskripsi

\b

Backspace yang digunakan untuk memindahkan posisi saat ini ke kolom sebelumnya.

\t

Tab.

\n

Baris baru yang digunakan untuk memindahkan posisi saat ini ke awal baris berikutnya.

\r

Carriage return yang digunakan untuk mereset posisi saat ini ke awal baris saat ini.

\'

Tanda kutip tunggal.

\"

Tanda kutip ganda (").

\\

Backslash.

\;

Semicolon.

\Z

Ctrl-Z.

\0 or \00

Karakter akhir.

null

Jika backslash diikuti oleh karakter yang tidak perlu di-escape, string tersebut setara dengan string tanpa backslash. Contohnya, \a setara dengan a.

Ekspresi reguler

Dalam ekspresi reguler, backslash \ digunakan untuk mencocokkan karakter tak terlihat. Ekspresi reguler mendeklarasikan pola untuk mencocokkan teks, tetapi banyak karakter khusus seperti ( ) ^ % digunakan dalam pola ini. Contohnya, mesin ekspresi reguler dasar dalam MaxCompute menggunakan RE2. Tabel berikut menjelaskan sintaks penggunaan backslash \ sebagai karakter escape.

Sintaks karakter escape

Deskripsi

\d

Mencocokkan digit. Ini setara dengan [0-9].

\D

Mencocokkan karakter non-digit. Ini setara dengan [^0-9].

\s

Mencocokkan karakter spasi putih. Ini setara dengan [\t\n\f\r ].

\S

Mencocokkan karakter non-spasi putih. Ini setara dengan [^\t\n\f\r ].

\w

Mencocokkan karakter alfanumerik. Ini setara dengan [0-9A-Za-z_].

\W

Mencocokkan karakter non-alfanumerik. Ini setara dengan [^0-9A-Za-z_].

Sintaks ekspresi reguler kompleks. Anda dapat menggunakan alat online seperti regexr atau regex101 untuk menulis ekspresi reguler sesuai kebutuhan.

JSON

JSON adalah protokol teks sederhana yang sering digunakan untuk mentransmisikan data. Untuk informasi lebih lanjut tentang JSON, lihat JSON. Tabel berikut menjelaskan sintaks karakter escape dalam JSON, di mana backslash \ digunakan sebagai karakter escape.

Sintaks karakter escape

Deskripsi

\"

Tanda kutip ganda.

\\

Backslash.

\/

Forward slash.

\b

Backspace.

\f

Form feed.

\n

Line feed.

\r

Carriage return.

\t

Horizontal tab.

\u+4-digit hexadecimal value

Karakter Unicode.

Desain karakter escape dalam JSON mirip dengan desain dalam SQL. Anda dapat menggunakan alat online seperti JSONLint untuk memverifikasi apakah teks sesuai dengan spesifikasi JSON.

Contoh

Backslash \ digunakan sebagai karakter escape dalam banyak spesifikasi. Jika backslash digunakan bersama karakter lain untuk escaping, teks dapat sulit dipahami. Dalam hal ini, pahami struktur bertingkat teks dan gunakan alat online yang disebutkan sebelumnya untuk melakukan escaping dan unescaping karakter secara bertahap. Berikut adalah beberapa contoh.

Gunakan karakter escape untuk menafsirkan karakter yang mengikuti karakter escape

  • Dalam MaxCompute SQL, konstanta string dapat direpresentasikan menggunakan tanda kutip tunggal atau ganda. Anda dapat menyertakan tanda kutip ganda dalam string yang diapit oleh tanda kutip tunggal, atau sebaliknya. Dalam kasus lain, gunakan karakter escape. Contohnya:

    "I'm a happy manong."
    'I\'m a happy manong.'
  • Jika Anda menggunakan LIKE untuk mencocokkan % atau _, karakter khusus tersebut harus di-escape. Contoh pernyataan:

    select 'ab_cde' like 'ab\_c%';
    
    -- Hasil berikut dikembalikan:
    true

Karakter khusus

  • String 'a\tb' mengandung tiga karakter, di mana \t dianggap sebagai satu karakter.

    select length('a\tb');
    
    -- Hasil berikut dikembalikan:
    3
  • String 'a\ab' mengandung tiga karakter, dan \a diinterpretasikan sebagai a.

    select 'a\ab',length('a\ab');
    
    -- Hasil berikut dikembalikan:
    aab,3

JSON + SQL escaping

Untuk teks JSON {"key":"this is very \"important\"."}, nilai yang diperoleh tidak valid ketika menggunakan fungsi get_json_object untuk mengekstrak nilai dari teks JSON.

-- Gunakan versi baru fungsi get_json_object untuk memeriksa integritas teks JSON.
set odps.sql.udf.getjsonobj.new=true;
select get_json_object('{"key":"this is very \"important\"."}', '$.key');

-- Hasil berikut dikembalikan:
NULL

Alasan kegagalan adalah bahwa teks JSON diapit oleh tanda kutip tunggal, tetapi karakter-karakter teks JSON tidak di-escape dalam SQL. Jalankan pernyataan SELECT berikut untuk verifikasi:

select '{"key":"this is very \"important\"."}'; 

-- Hasil berikut dikembalikan:
{"key":"this is very "important"."}

Backslash hilang dalam teks JSON karena kompiler menganggap karakter escape JSON sebagai karakter escape SQL selama parsing, menginterpretasikan \" sebagai ". Hasil yang diperoleh tidak sesuai dengan sintaks JSON, sehingga menyebabkan kegagalan parsing. Tambahkan karakter escape SQL yang valid ke teks JSON. Teks JSON diubah menjadi '{"key":"this is very \\"important\\"."}'. Kemudian, gunakan fungsi get_json_object untuk mengekstrak nilai lagi. Hasil yang dikembalikan valid.

set odps.sql.udf.getjsonobj.new=true;
select get_json_object('{"key":"this is very \\"important\\"."}', '$.key');

-- Hasil berikut dikembalikan:
this is very "important".

Teks sederhana + ekspresi reguler + SQL escaping

Untuk mengekstrak 010 dari teks 010-12345678 menggunakan fungsi, lakukan langkah-langkah berikut:

  1. Tulis ekspresi reguler (\d+)-.

  2. Escape backslash \ dalam ekspresi reguler berdasarkan aturan escaping SQL dan apit ekspresi reguler dalam tanda kutip tunggal untuk memperoleh string '(\\d+)-'.

Jalankan pernyataan berikut dalam MaxCompute untuk verifikasi:

select REGEXP_EXTRACT('010-12345678', '(\\d+)-');

-- Hasil berikut dikembalikan:
010

JSON + ekspresi reguler + SQL escaping

Untuk mencocokkan important dari string yang mengandung karakter escape, seperti string JSON {"key":"this is very \"important\"."} menggunakan ekspresi reguler, lakukan langkah-langkah berikut:

  1. Tulis ekspresi reguler \"(.*)\".

  2. Escape backslash dalam ekspresi reguler. Setelah di-escape, ekspresi reguler menjadi \\"(.*)\\".

  3. Lakukan escaping SQL untuk ekspresi dengan mengganti \ dengan \\. Untuk kesederhanaan, apit ekspresi dalam tanda kutip tunggal untuk memperoleh string '\\\\"(.*)\\\\"'.

Jalankan pernyataan berikut dalam MaxCompute untuk verifikasi:

select REGEXP_EXTRACT('{"key":"this is very \\"important\\"."}', '\\\\"(.*)\\\\"');

-- Hasil berikut dikembalikan:
important

Hasilnya sesuai harapan. Dalam skenario serupa, kami sarankan Anda mem-parsing teks JSON terlebih dahulu agar logikanya lebih jelas. Contoh pernyataan:

set odps.sql.udf.getjsonobj.new=true;
select REGEXP_EXTRACT(get_json_object('{"key":"this is very \\"important\\"."}', '$.key'), '"(.*)"');

-- Hasil berikut dikembalikan:
important

Dalam contoh di atas, pernyataan yang valid ditulis untuk memenuhi kebutuhan bisnis Anda. Namun, setelah operasi escaping, string karakter '\\\\"(.*)\\\\"' sulit dipahami. Anda dapat melakukan operasi terbalik pada string mentah dengan menggunakan pernyataan SELECT dan menyimpulkan pola yang ingin Anda cocokkan berdasarkan string mentah dan alat ekspresi reguler. Contoh SELECT statement:

select '\\\\"(.*)\\\\"';

-- Hasil berikut dikembalikan:
\\"(.*)\\"

Peningkatan SQL escaping

Backslash \ digunakan sebagai karakter escape dalam SQL, JSON, dan ekspresi reguler karena backslash jarang digunakan dalam pernyataan umum. Namun, jika spesifikasi SQL, JSON, dan ekspresi reguler digunakan bersama-sama, backslash mungkin muncul secara sering. Ini mengakibatkan pembengkakan karakter escape. Untuk mengatasi masalah ini, MaxCompute memperkenalkan metode escape baru: R"()". Jika Anda menggunakan metode escape ini, karakter yang diapit dalam tanda kurung () tidak perlu di-escape menggunakan backslash \.

Contoh:

  • R"(abc)" setara dengan 'abc'.

  • R'(\\"(.*)\\")' setara dengan '\\\\"(.*)\\\\"'.

Huruf R menunjukkan string mentah dan tidak peka huruf besar/kecil. Anda dapat mengubahnya menjadi r. Anda juga dapat mengubah tanda kutip ganda menjadi tanda kutip tunggal. Dalam MaxCompute, Anda tidak perlu menambahkan \ ke setiap string yang ingin Anda escape. Anda hanya perlu memodifikasi kedua sisi string. Anda juga dapat menjalankan pernyataan berikut untuk mencocokkan important dari string JSON menggunakan ekspresi reguler:

select REGEXP_EXTRACT(R'({"key":"this is very \"important\"."})', R'(\\"(.*)\\")');

-- Hasil berikut dikembalikan:
important

Metode ini secara signifikan menyederhanakan escaping string JSON dan ekspresi reguler.