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.
Tentukan aturan untuk karakter khusus seperti
'dan".Proses karakter khusus dengan makna tertentu atau karakter tak terlihat. Contohnya, karakter ' di-escape menjadi
\', dan " menjadi\".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.
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. |
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 |
\D | Mencocokkan karakter non-digit. Ini setara dengan |
\s | Mencocokkan karakter spasi putih. Ini setara dengan |
\S | Mencocokkan karakter non-spasi putih. Ini setara dengan |
\w | Mencocokkan karakter alfanumerik. Ini setara dengan |
\W | Mencocokkan karakter non-alfanumerik. Ini setara dengan |
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\tdianggap sebagai satu karakter.select length('a\tb'); -- Hasil berikut dikembalikan: 3String
'a\ab'mengandung tiga karakter, dan\adiinterpretasikan sebagaia.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:
NULLAlasan 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:
Tulis ekspresi reguler
(\d+)-.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:
010JSON + 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:
Tulis ekspresi reguler
\"(.*)\".Escape backslash dalam ekspresi reguler. Setelah di-escape, ekspresi reguler menjadi
\\"(.*)\\".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:
importantHasilnya 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:
importantDalam 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:
importantMetode ini secara signifikan menyederhanakan escaping string JSON dan ekspresi reguler.