Dokumen ini menjelaskan penggunaan, parameter, dan contoh semua fungsi JSON dalam Lindorm SQL.
Ikhtisar fungsi JSON
Klasifikasi fungsi | Nama fungsi | Deskripsi fungsi |
Fungsi konstruktor JSON | Membuat objek JSON. | |
Membuat array JSON. | ||
Fungsi ekstraksi JSON | Mengekstraksi nilai dari dokumen JSON pada path yang ditentukan. | |
Mengekstraksi nilai pada path yang ditentukan dan mengonversinya menjadi string. | ||
Mengekstraksi nilai pada path yang ditentukan dan mengonversinya menjadi bilangan bulat panjang (long integer). | ||
Mengekstraksi nilai pada path yang ditentukan dan mengonversinya menjadi bilangan titik mengambang. | ||
Fungsi pemeriksaan keterkandungan JSON | Memeriksa apakah dokumen JSON berisi semua nilai atau objek yang ditentukan. | |
Memeriksa apakah dokumen JSON berisi salah satu dari nilai atau objek yang ditentukan. | ||
Fungsi pembaruan JSON | Menyisipkan atau memperbarui data dalam dokumen JSON dan mengembalikan dokumen baru. Ini setara dengan | |
Menyisipkan data ke dalam dokumen JSON dan mengembalikan dokumen baru. Fungsi ini hanya menyisipkan field baru jika field tersebut belum ada. | ||
Mengganti data yang sudah ada dalam dokumen JSON dan mengembalikan dokumen baru. Fungsi ini hanya memperbarui nilai jika field tersebut sudah ada. | ||
Menghapus data dari dokumen JSON pada path yang ditentukan dan mengembalikan dokumen yang telah dimodifikasi. | ||
Semantiknya sama dengan |
Deskripsi fungsi
Fungsi konstruktor JSON
json_object
Membuat objek JSON.
Sintaks:
json_object(key1, value1, key2, value2, ...)
Parameter:
key: Nama kunci. Harus berupa string.value: Nilai. Dapat bertipe apa saja.
Contoh:
-- Membuat objek sederhana
SELECT json_object('name', 'Alice', 'age', 25);
-- Hasil: {"name": "Alice", "age": 25}
-- Gunakan dalam pernyataan INSERT
UPSERT INTO users (id, data) VALUES (1, json_object('name', 'Charlie', 'city', 'Beijing'));json_array
Membuat array JSON.
Sintaks:
json_array(value1, value2, value3, ...)Parameter:
value: Nilai. Dapat berupa skalar, objek, atau array.
Contoh:
-- Membuat array sederhana
SELECT json_array('apple', 'banana', 'orange');
-- Hasil: ["apple", "banana", "orange"]
-- Gunakan dalam pernyataan INSERT
UPSERT INTO products (id, tags) VALUES (1, json_array('electronics', 'mobile', 'smartphone'));
Fungsi ekstraksi JSON
json_extract
Mengekstraksi nilai dari dokumen JSON pada path yang ditentukan.
Sintaks:
json_extract(json_column, 'path')Parameter:
json_column: Kolom atau ekspresi bertipe JSON.path: Ekspresi path JSON, seperti$.field,$.array[0], atau$.nested.field.
Contoh:
-- Ekstraksi field sederhana
SELECT json_extract('{"name": "Alice", "age": 25}', '$.name');
-- Hasil: "Alice"
-- Ekstraksi field bersarang
SELECT json_extract('{"user": {"name": "Bob", "age": 30}}', '$.user.name');
-- Hasil: "Bob"
-- Ekstraksi elemen array
SELECT json_extract('{"skills": ["Java", "Python"]}', '$.skills[0]');
-- Hasil: "Java"
-- Ekstraksi seluruh array
SELECT json_extract('{"skills": ["Java", "Python"]}', '$.skills');
-- Hasil: ["Java", "Python"]
-- Klausul WHERE dengan angka
select * from tb where json_extract(c2, '$.k3.k4') > 5;
-- Klausul WHERE dengan string
select * from tb where json_extract_string(c2, '$.k2') = '1';Fungsi ekstraksi berbasis tipe: json_extract_type
json_extract_string
Mengekstraksi nilai pada path yang ditentukan dan mengonversinya menjadi string. Jika nilai pada path tersebut bukan string, fungsi ini mengembalikan NULL secara default.
SELECT json_extract_string('{"name": "Alice"}', '$.name');
-- Hasil: Alice (tipe VARCHAR)
SELECT json_extract_string('{"number": "30"}', '$.name');
-- Hasil: NULL. (Tipenya Number, tidak sesuai.)json_extract_long
Mengekstraksi nilai pada path yang ditentukan dan mengonversinya menjadi bilangan bulat panjang (long integer). Jika nilai pada path tersebut bukan angka, Java Database Connectivity (JDBC) melemparkan error.
SELECT json_extract_long('{"id": 123456789}', '$.id');
-- Hasil: 123456789 (tipe LONG)
SELECT json_extract_long('{"id": 123456.789}', '$.id');
-- Melemparkan error
SELECT json_extract_long('{"id": "123456.789"}', '$.id');
-- Melemparkan errorjson_extract_double
Mengekstraksi nilai pada path yang ditentukan dan mengonversinya menjadi bilangan titik mengambang. Jika nilai pada path tersebut bukan bilangan titik mengambang, JDBC melemparkan error.
SELECT json_extract_double('{"id": 12345.56}', '$.id');
-- Hasil: 12345.56 (tipe Double)
SELECT json_extract_double('{"id": 12345}', '$.id');
-- Hasil: 12345.0 (tipe Double)
SELECT json_extract_double('{"id": "123456.789"}', '$.id');
-- Melemparkan errorKetiga fungsi ini bersifat strongly typed. Elemen pada path yang ditentukan harus secara ketat sesuai dengan tipe fungsi tersebut. Jika tidak, fungsi akan mengembalikan NULL atau melemparkan error. Anda dapat mengonfigurasi kluster untuk memaksa konversi tipe, tetapi hal ini tidak disarankan. Kami menyarankan agar Anda mendefinisikan tipe data sebelum menyisipkan data JSON karena tipe campuran dapat menyebabkan masalah logika yang tidak terduga.
Fungsi pemeriksaan keterkandungan JSON
json_contains
Memeriksa apakah dokumen JSON berisi semua nilai atau objek yang ditentukan.
Sintaks:
json_contains(target, candidate[, path])Parameter:
target_json: Wajib. Dokumen JSON.candidate_json: Wajib. Dokumen JSON yang akan diperiksa keberadaannya.path: Opsional. Ekspresi path.
Untuk informasi lebih lanjut tentang parameter, lihat Informasi parameter tambahan.
Nilai kembalian:
1(true): Nilai yang ditentukan ditemukan.0(false): Target tidak berisi kandidat.
Fungsi json_contains mengembalikan 1 jika dokumen target_json berisi dokumen candidate_json, dan 0 jika tidak. Jika Anda menentukan parameter path, fungsi ini memeriksa apakah data pada path yang ditentukan berisi dokumen candidate_json.
Fungsi json_contains mengembalikan NULL dalam kasus-kasus berikut:
Path yang ditentukan tidak ada dalam dokumen JSON.
Salah satu parameter bernilai
NULL.
Contoh:
-- Membuat tabel dan menyisipkan data
CREATE TABLE test_table (id INT, c1 VARCHAR, data JSON, PRIMARY KEY(id));
UPSERT INTO test_table (id, data) VALUES (1, NULL);
UPSERT INTO test_table (id, data) VALUES (2, '{"skills": ["Java", "Python"]}');
UPSERT INTO test_table (id, data) VALUES (3, '{"skills": ["Go", "C"]}');
UPSERT INTO test_table (id, data) VALUES (4, '{"technical_skills": ["Java", "Go", "Rust"]}');
UPSERT INTO test_table (id, data) VALUES (5, '["Java","C++", "JavaScript"]');
UPSERT INTO test_table (id, data) VALUES (6, '{"skills": "Java"}');
UPSERT INTO test_table (id, data) VALUES (7, '["Java", "C#"]');
UPSERT INTO test_table (id, data) VALUES (8, '{"skills": ["Go", "Rust"]}');-- Bentuk dua parameter. Path default adalah '$'.
mysql> SELECT id, data FROM test_table WHERE json_contains(data, '["Java"]') and id>0 and id<10;
+------+------------------------------+
| id | data |
+------+------------------------------+
| 5 | ["Java","C++", "JavaScript"] |
| 7 | ["Java", "C#"] |
+------+------------------------------+
2 rows in set (0.01 sec)
-- Bentuk tiga parameter: Periksa path tertentu
mysql> SELECT id, data FROM test_table WHERE json_contains(data, '["Java"]', '$.skills') and id>0 and id<10;
+------+--------------------------------+
| id | data |
+------+--------------------------------+
| 2 | {"skills": ["Java", "Python"]} |
+------+--------------------------------+
1 row in set (0.01 sec)
-- Berisi "Java" dan "Go"
mysql> SELECT id, data FROM test_table WHERE json_contains(data, '["Java","Go"]', '$.skills') and id>0 and id<10;
Empty set (0.02 sec)
-- Array atau elemen berisi skalar "Java"
mysql> SELECT id, data FROM test_table WHERE json_contains(data, '"Java"', '$.skills') and id>0 and id<10;
+------+--------------------------------+
| id | data |
+------+--------------------------------+
| 2 | {"skills": ["Java", "Python"]} |
| 6 | {"skills": "Java"} |
+------+--------------------------------+
2 rows in set (0.01 sec)
-- Elemen array berisi array yang hanya memiliki skalar "Java". (Untuk id=6, dokumen JSON pada path tersebut adalah skalar. Subset dari skalar hanya bisa berupa skalar, bukan array.)
mysql> SELECT id, data FROM test_table WHERE json_contains(data, '["Java"]', '$.skills') and id>0 and id<10;
+------+--------------------------------+
| id | data |
+------+--------------------------------+
| 2 | {"skills": ["Java", "Python"]} |
+------+--------------------------------+
1 row in set (0.01 sec)
-- Periksa apakah seluruh dokumen berisi objek
SELECT json_contains('{"a": 1, "b": 2}', '{"a": 1}');
-- Hasil: 1
-- Periksa apakah path tertentu berisi nilai
SELECT json_contains('{"a": 1, "b": 2}', '1', '$.a');
-- Hasil: 1
SELECT json_contains('{"a": 1, "b": 2}', '1', '$.b');
-- Hasil: 0
-- Periksa keterkandungan dalam array
SELECT json_contains('{"skills": ["Java", "Python"]}', '"Java"', '$.skills');
-- Hasil: 1Informasi parameter tambahan
candidate_jsonadalah dokumen JSON. Anda harus merepresentasikan elemen yang sesuai sebagai string JSON.Dokumen JSON yang berisi angka 10:
'10'Dokumen JSON yang berisi string "10":
'"10"'Dokumen JSON yang berisi daftar angka:
'[1,2,3]'Dokumen JSON yang berisi daftar string:
'["10","abc","key"]'
Subset dari skalar hanya bisa berupa skalar. Subset dari array bisa berupa elemen atau array.
Klasifikasi tipe JSON:
Skalar: String, Angka (Integer/Double), Boolean, Null
Tipe kompleks: Array, Objek
Pertimbangkan kondisi pemeriksaan
json_contains_any(skills, '["Java"]', '$.technical_skills'). Untuk JSON pada path$.technical_skills:Jika nilainya
{"technical_skills":"Java"}, fungsi mengembalikanfalse. Subset dari string tidak bisa berupa daftar.Jika nilainya
{"technical_skills":["Java"]}atau{"technical_skills":["Java","Go"]}, fungsi mengembalikantrue.
Pertimbangkan kondisi pemeriksaan
json_contains_any(skills, '"Java"', '$.technical_skills'). Untuk JSON pada path$.technical_skills:Jika nilainya
{"technical_skills":"Java"}, fungsi mengembalikantrue.Jika nilainya
{"technical_skills":["Java"]}atau{"technical_skills":["Java","Go"]}, fungsi mengembalikantrue.
json_contains_any
Memeriksa apakah dokumen JSON berisi salah satu dari nilai atau objek yang ditentukan.
Sintaks:
Sintaksnya sama dengan json_contains. Untuk informasi lebih lanjut tentang perbedaannya, lihat Perbandingan fungsi pemeriksaan keterkandungan JSON.
Contoh:
mysql> select json_contains_any('{"skills": ["Java", "Python"]}', '["Java", "Go"]');
+--------+
| EXPR$0 |
+--------+
| 0 |
+--------+
1 row in set (0.02 sec)
mysql> select json_contains_any('{"skills": ["Java", "Python"]}', '["Java", "Go"]','$.skills');
+--------+
| EXPR$0 |
+--------+
| 1 |
+--------+
1 row in set (0.03 sec)
-- Bentuk default dua parameter. Path default adalah '$'.
mysql> SELECT id, data FROM test_table WHERE json_contains_any(data, '["Java", "Go"]') limit 10;
+------+------------------------------+
| id | data |
+------+------------------------------+
| 5 | ["Java","C++", "JavaScript"] |
| 7 | ["Java", "C#"] |
+------+------------------------------+
2 rows in set (0.01 sec)
-- Bentuk tiga parameter
mysql> SELECT id, data FROM test_table WHERE json_contains_any(data, '["Java", "Go", "Rust"]', '$.skills') limit 10;
+------+--------------------------------+
| id | data |
+------+--------------------------------+
| 2 | {"skills": ["Java", "Python"]} |
| 3 | {"skills": ["Go", "C"]} |
| 6 | {"skills": "Java"} |
| 8 | {"skills": ["Go", "Rust"]} |
+------+--------------------------------+
4 rows in set (0.01 sec)
-- Periksa apakah berisi salah satu nilai dari array
SELECT json_contains_any('{"skills": ["Java", "Python"]}', '["Java", "Go"]');
-- Hasil: 0
SELECT json_contains_any('{"skills": ["Java", "Python"]}', '["Java", "Go"]','$.skills');
-- Hasil: 1
-- Periksa pada path tertentu
SELECT json_contains_any('{"departments": ["Engineering", "Sales"]}', '["Marketing", "Engineering"]', '$.departments');
-- Hasil: 1Fungsi pembaruan JSON
json_set
Menyisipkan atau memperbarui data dalam dokumen JSON dan mengembalikan dokumen yang telah dimodifikasi. Fungsi ini setara dengan json_insert + json_replace.
Sintaks:
json_set(json_column, 'path', new_value)Perilaku:
Jika path yang ditentukan ada, fungsi ini memperbarui nilai pada path tersebut.
Jika path yang ditentukan tidak ada, fungsi ini menyisipkan nilai pada path tersebut.
Jika kolom JSON bernilai NULL, hasilnya juga NULL. Tidak ada aksi yang dilakukan.
Contoh:
-- Memperbarui field yang sudah ada
UPSERT INTO test_table (id, data) VALUES (3, '{"name": "Charlie", "age": 30}');
UPDATE test_table SET data = json_set(data, '$.age', 31) WHERE id = 3;
-- Hasil: {"name": "Charlie", "age": 31}
-- Menyisipkan field baru
UPDATE test_table SET data = json_set(data, '$.department', 'Engineering') WHERE id = 3;
-- Hasil: {"name": "Charlie", "age": 31, "department": "Engineering"}
-- Ketika kolom JSON bernilai NULL (perbedaan utama dari json_upsert)
UPSERT INTO test_table (id,c1) VALUES (4,'test');
UPDATE test_table SET data = json_set(data, '$.name', 'David') WHERE id = 4;
-- Hasil: NULLjson_insert
Menyisipkan data ke dalam dokumen JSON dan mengembalikan dokumen yang telah dimodifikasi. Fungsi ini hanya menyisipkan nilai baru jika nilai tersebut belum ada pada path yang ditentukan.
Sintaks:
json_insert(json_column, 'path', new_value)Perilaku:
Jika path yang ditentukan tidak ada, fungsi ini menyisipkan nilai pada path tersebut.
Jika path yang ditentukan sudah ada, fungsi ini tidak melakukan apa-apa.
Contoh:
-- Menyisipkan field baru
UPSERT INTO test_table (id, data) VALUES (5, '{"name": "Eve"}');
UPDATE test_table SET data = json_insert(data, '$.age', 28) WHERE id = 5;
-- Hasil: {"name": "Eve", "age": 28}
-- Mencoba menyisipkan field yang sudah ada (tidak berpengaruh)
UPDATE test_table SET data = json_insert(data, '$.name', 'New Name') WHERE id = 5;
-- Hasil: {"name": "Eve", "age": 28} (Field name tetap tidak berubah)json_replace
Mengganti data yang sudah ada dalam dokumen JSON dan mengembalikan dokumen yang telah dimodifikasi. Fungsi ini hanya memperbarui nilai jika nilai tersebut sudah ada pada path yang ditentukan.
Sintaks:
json_replace(json_column, 'path', new_value)Perilaku:
Jika path yang ditentukan ada, fungsi ini memperbarui nilai pada path tersebut.
Jika path yang ditentukan tidak ada, fungsi ini tidak melakukan apa-apa.
Contoh:
-- Memperbarui field yang sudah ada
UPSERT INTO test_table (id, data) VALUES (6, '{"name": "Frank", "age": 35}');
UPDATE test_table SET data = json_replace(data, '$.age', 36) WHERE id = 6;
-- Hasil: {"name": "Frank", "age": 36}
-- Mencoba memperbarui field yang tidak ada (tidak berpengaruh)
UPDATE test_table SET data = json_replace(data, '$.city', 'Shanghai') WHERE id = 6;
-- Hasil: {"name": "Frank", "age": 36} (Tidak ada field city)json_remove
Menghapus data dari dokumen JSON pada path yang ditentukan dan mengembalikan dokumen yang telah dimodifikasi.
Sintaks:
json_remove(json_column, 'path')Perilaku:
Jika path yang ditentukan ada, fungsi ini menghapus data pada path tersebut.
Jika path yang ditentukan tidak ada, operasi ini aman dan tidak terjadi error.
Contoh:
-- Menghapus field
UPSERT INTO test_table (id, data) VALUES (7, '{"name": "Grace", "temp_field": "to_remove"}');
UPDATE test_table SET data = json_remove(data, '$.temp_field') WHERE id = 7;
-- Hasil: {"name": "Grace"}
-- Menghapus field yang tidak ada (aman)
UPDATE test_table SET data = json_remove(data, '$.nonexistent') WHERE id = 7;
-- Hasil: {"name": "Grace"} (Tidak ada error)json_upsert
Fungsi ini secara semantik sama dengan json_set, tetapi dapat menangani nilai NULL.
Sintaks:
json_upsert(json_column, 'path', new_value)
Perilaku:
Jika kolom JSON bernilai NULL, fungsi ini membuat objek baru:
{path: new_value}Jika path yang ditentukan ada, fungsi ini memperbarui nilai pada path tersebut.
Jika path yang ditentukan tidak ada, fungsi ini menyisipkan nilai pada path tersebut.
Contoh:
-- Ketika kolom JSON bernilai NULL
CREATE TABLE test_table (id INT, c1 VARCHAR, data JSON, PRIMARY KEY(id));
UPSERT INTO test_table (id,c1) VALUES (1,'test');
UPDATE test_table SET data = json_upsert(data, '$.name', 'Alice') WHERE id = 1;
-- Hasil: {"name": "Alice"}
-- Memperbarui field yang sudah ada
UPSERT INTO test_table (id, data) VALUES (2, '{"name": "Bob", "age": 25}');
UPDATE test_table SET data = json_upsert(data, '$.age', 26) WHERE id = 2;
-- Hasil: {"name": "Bob", "age": 26}
-- Menyisipkan field baru
UPDATE test_table SET data = json_upsert(data, '$.city', 'Beijing') WHERE id = 2;
-- Hasil: {"name": "Bob", "age": 26, "city": "Beijing"}Untuk informasi lebih lanjut tentang perbedaan antara fungsi pembaruan JSON ini, lihat Perbandingan fungsi pembaruan JSON.
Rangkuman perbandingan fungsi
Perbandingan fungsi pemeriksaan keterkandungan JSON
Fungsi | Perbedaan |
| Untuk Dengan kata lain, |
| Untuk Dengan kata lain, |
Perbandingan fungsi pembaruan JSON
Fungsi | Penanganan kolom NULL | Field ada | Field tidak ada | Kasus penggunaan utama |
| Tetap NULL | Perbarui | Sisipkan | Memperbarui kolom yang diketahui tidak NULL. (Sesuai dengan semantik MySQL). |
| Membuat objek baru | Perbarui | Sisipkan | Pembaruan tujuan umum. Menyisipkan bahkan jika kolom bernilai NULL. |
| Tetap NULL | Tidak ada operasi | Sisipkan | Hanya menyisipkan field baru. |
| Tetap NULL | Perbarui | Tidak ada operasi | Hanya memperbarui field yang sudah ada. |
| Tetap NULL | Hapus | Tidak ada operasi | Menghapus field. |
Dukungan indeks berbasis fungsi
Sintaks
create_index_statement ::= CREATE INDEX [ index_name ]
ON table_name '(' index_identifier ')'
[INCLUDE include_identifier]
[ASYNC]
[ index_options ]
index_identifier ::= '('json_extract_type(column, json_path)')'
include_identifier ::= '('column_name1,...,column_namen ')'Deskripsi parameter
Parameter | Deskripsi |
index_name | Nama tabel indeks. |
table_name | Nama tabel lebar. |
json_extract_type | Mengekstraksi field dengan tipe data tertentu dari kolom JSON untuk digunakan sebagai indeks sekunder. Jika tipe data tidak sesuai, indeks sekunder tidak dibuat. Jenis fungsi berikut didukung:
|
column | Nama kolom JSON. |
json_path | Path dalam kolom JSON. Digunakan untuk mengekstraksi nilai pada path yang ditentukan. |
ASYNC | Membangun indeks secara asinkron. Jika Anda tidak menambahkan ASYNC, indeks dibangun secara sinkron. |
Untuk informasi lebih lanjut tentang dukungan indeks pencarian untuk fungsi JSON, lihat Gunakan indeks pencarian untuk tipe JSON Lindorm.
Fungsi yang didukung
Fungsi JSON berikut mendukung pembuatan indeks berbasis fungsi:
Mempercepat kueri terkait json_extract dan json_extract_type
json_extract_string(json_column, 'path')json_extract_long(json_column, 'path')json_extract_double(json_column, 'path')
Lindorm wide table SQL memungkinkan Anda membuat indeks sekunder untuk data pada path tertentu dalam kolom bertipe JSON. Namun, saat membuat indeks sekunder, Anda harus menentukan tipe fungsi json_extract untuk kolom JSON tersebut.
Mempercepat kueri terkait json_contains
json_contains(json_column, 'value', 'path')
Saat ini, parameter value dan path harus berupa nilai tetap. Kondisi kueri harus statis.
Contoh pembuatan indeks
-- Membuat indeks untuk json_contains
CREATE INDEX idx_user_role ON test_table (json_contains(data, '"admin"', '$.roles')) INCLUDE(data) SYNC;
-- Membuat indeks untuk json_extract_string
CREATE INDEX idx_user_city ON test_table (json_extract_string(data, '$.address.city')) INCLUDE(data) SYNC;
-- Membuat indeks untuk json_extract_string tanpa menyertakan kolom
CREATE INDEX idx_user_city ON test_table (json_extract_string(data, '$.address.city'));
-- Membuat indeks untuk json_extract_long
CREATE INDEX idx_user_age ON test_table (json_extract_long(data, '$.age')) INCLUDE(data) SYNC;
-- Melihat hasil pembuatan indeks
SHOW INDEX FROM test_table;Batasan
Selalu ikuti sintaks standar saat menggunakan JsonPath.
Perhatikan dampak performa dari operasi JSON yang kompleks.
Untuk path yang sering dikueri, Anda dapat membuat indeks untuk meningkatkan kecepatan respons kueri.
Penanganan error umum
Path JSON tidak valid
Error
illegal json pathterjadi jikaJsonPathbukanJsonPathyang valid. Untuk informasi lebih lanjut, lihat definisiJsonPathMySQL.Nilai JSON tidak valid
json_contain candidate is not a valid value: Periksa bahwa parametercandidateadalah string JSON yang valid.Peringatan pemindaian tabel penuh
This query may be a full table scan and thus may have unpredictable performance: Peringatan ini menunjukkan pemindaian tabel penuh yang tidak efisien. Anda dapat membuat indeks untuk mempercepat kueri atau menambahkan klausa `LIMIT` untuk memfilter subset data.
Rekomendasi
Pilih fungsi pembaruan yang tepat
Anda dapat memilih
json_upsertataujson_setberdasarkan kebutuhan bisnis Anda.Perencanaan indeks
Anda dapat membuat indeks berbasis fungsi untuk path JSON yang sering dikueri.
Keamanan tipe
Anda dapat menggunakan fungsi ekstraksi berbasis tipe untuk memastikan kebenaran tipe data. Hindari mencampur angka dan string numerik, karena dapat menyebabkan ambiguitas. Misalnya, hindari mencampur angka 10 dan string "10".