Versi mysql mana yang mendukung json?

Tampaknya hampir setiap database selama beberapa tahun terakhir telah memperkenalkan berbagai tingkat dukungan untuk menyimpan dan berinteraksi dengan objek JSON secara langsung. Sementara fitur-fitur ini dirancang untuk memudahkan pengembang aplikasi menulis kode lebih cepat, implementasi dari setiap implementasi cenderung sangat bervariasi dan dapat menyebabkan beberapa, yah, keanehan. Selama beberapa minggu/bulan ke depan, saya akan menunjukkan kepada Anda beberapa metode, kesalahan, dan cara umum pengembang menyimpan JSON. Hanya karena Anda dapat menggunakan dukungan JSON asli database tidak selalu berarti Anda harus melakukannya. Saya berharap untuk menunjukkan kepada Anda mana yang paling cocok untuk kasus penggunaan mana

Untuk bagian pertama dari seri ini, saya akan fokus pada MySQL. Implementasi MySQL dari tipe data JSON diperkenalkan kembali pada tahun 5. 7 (Jangka waktu akhir 2015/Awal 2016). Sejak saat itu, beberapa peningkatan kecil telah membuat penerapannya sedikit lebih nyaman untuk ditinggali. Iterasi MySQL 8 saat ini menawarkan implementasi fungsi dan fitur JSON yang berfungsi penuh. Izinkan saya menunjukkan kepada Anda beberapa contoh cara menyimpan dan berinteraksi dengan dokumen JSON Anda di dalam MySQL

Mempersiapkan

Untuk semua pengujian saya, saya menginginkan jumlah data yang masuk akal untuk menguji implikasi kinerja dari fungsi tertentu. Saya memilih untuk menggunakan metadata JSON dari http. //film. situs/, sekitar 2. 3 GB file JSON individu (satu per film)

Saya menulis skrip python kecil untuk memuat dan mengulang melalui file JSON dan memuatnya ke MySQL

Versi mysql mana yang mendukung json?

Saya akan menelusuri contoh-contohnya dan menunjukkan kepada Anda bagaimana saya telah melihat banyak pengembang menggunakan MySQL untuk berinteraksi dengan JSON dan menunjukkan mengapa beberapa di antaranya mungkin salah atau menyebabkan masalah yang mungkin tidak Anda sadari. Saya juga akan menunjukkan kepada Anda beberapa fitur lain yang mungkin ingin Anda lihat dan jelajahi serta menawarkan beberapa saran desain. Mari kita mulai dengan definisi tabel sederhana berikut

Kerang

1

2

3

4

5

6

7

buat tabel movies_json (

   ai_myid int AUTO_INCREMENT primer key,

   imdb_id varchar(255),

   json_column json

) mesin = innodb;

 

buat unik indeks imdb_idx pada movies_json(imdb_id);

 

Kerang

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

{

  "imdb_id". "tt8408760",

  "tmdb_id". nol,

  "douban_id". nol,

  "judul". "Rube (2019)",

  "genre". [

    "Pendek",

    "Komedi",

    "Horor"

  ],

  "negara". "AS",

  "versi". [

    {

      "waktu proses". "7 menit",

      "deskripsi". ""

    }

  ],

  "imdb_rating". nol,

  "sutradara". [

    {

      "id". "nm3216042",

      "nama". "Bungker Nathan Alan"

    }

  ],

  "penulis". nol,

  "casting". [

    {

      "id". "nm1899908",

      "nama". "Brendan Jennings",

      "karakter". "Milton"

    },

    {

      "id". "nm2384265",

      "nama". "Ben Begley",

      "karakter". "Paulus"

    },

    {

      "id". "nm2287013",

      "nama". "Jerry Marr",

      "karakter". "Profesor Henson"

    },

    {

      "id". "nm7529700",

      "nama". "Pangeran Allen",

      "karakter". "Margaret"

    }

  ],

  "ikhtisar". nol,

  "alur cerita". "Dua guru yang tidak puas menggunakan mesin Rube Goldberg untuk membalas dendam pada orang yang telah menganiaya mereka. ",

  "plot". nol,

  "sinopsis". nol

}

Anda dapat melihat contoh format JSON

101. Interaksi JSON sederhana di MySQL

Ya, satu kolom dalam tabel dengan satu atau dua kunci. Setiap baris akan menyimpan salah satu film dalam file JSON yang diunduh. Ada kunci auto_increment dan ID IMDB yang saya ekstrak dari JSON selama pemuatan. Struktur dan pengaturan ini adalah desain langsung dengan sedikit usaha. Namun, desain ini juga berarti Anda umumnya mengandalkan MySQL hanya sebagai penyimpanan data Anda. Asalkan Anda mengakses semuanya dengan kunci imdb_id, Anda bisa mendapatkan dan memperbarui JSON ke aplikasi Anda dengan mudah dengan

Kerang

1

2

3

pilih json_column dari movies_json di mana imdb_id = tt4154796;

 

perbarui movies_json set json_column = <new JSON> where imdb_id = tt4154796;

Namun, pada akhirnya, Anda ingin mencari di dalam JSON Anda atau hanya mengembalikan sebagian dari Dokumen JSON. Misalnya, Anda hanya ingin mencari judul dan rating IMDB untuk film tertentu. Anda dapat melakukan ini dengan fungsionalitas bawaan

Kerang

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

mysql> pilih json_column - >>'$.title', json_column - >>'$.imdb_rating' dari movies_json di mana json_column->>'$.imdb_id' = 'tt2395427';

+--------------------------------+----------------

. json_column - >>' . judul'        . json_column - >>' . imdb_rating' .

+--------------------------------+----------------

. Pembalas. Usia dari Ultron (2015 . ) | 7. 5                           .

+--------------------------------+----------------

1 baris di set (0.77 dtk)

 

 

mysql> pilih json_column - >>'$.title', json_column - >>'$.imdb_rating' dari movies_json di mana json_column->>'$.imdb_id' = 'tt4154796';

+--------------------------+-------------------------------

. json_column - >>' . judul'  . json_column - >>' . imdb_rating' .

+--------------------------+-------------------------------

. Pembalas. Permainan Akhir (2019) . null                          .

+--------------------------+-------------------------------

1 baris di set (0.75 dtk)

Di sini Anda dapat melihat kita dapat berinteraksi di dalam kolom JSON seperti yang kita lakukan dengan data standar melalui SQL dengan menggunakan sintaks khusus "'". Anda bisa melihat Pembalas. Endgame memiliki peringkat nol. Itu tidak bagus, dan itu film yang jauh lebih baik dari itu. Alih-alih memperbarui dan menyimpan kembali seluruh dokumen JSON, MySQL menyediakan untuk mengatur elemen di dalam dokumen

Kerang

1

2

3

4

5

6

7

8

9

10

11

12

13

mysql>  perbarui movies_json

       set json_column = JSON_SET(json_column, "$.imdb_rating", 9)

       di mana json_column - >>'$.imdb_id' = 'tt4154796';

Kueri OK, 1 baris affected (0.93 dtk)

Baris cocok. 1  Berubah. 1  Peringatan. 0

 

mysql> pilih json_column - >>'$.title', json_column - >>'$.imdb_rating' dari movies_json di mana json_column->>'$.imdb_id' = 'tt4154796';

+--------------------------+-------------------------------

. json_column - >>' . judul'  . json_column - >>' . imdb_rating' .

+--------------------------+-------------------------------

. Pembalas. Permainan Akhir (2019) . 9                             .

+--------------------------+-------------------------------

1 baris di set (0.80 dtk)

Kami sekarang telah memperbaiki peringkat yang hilang untuk Endgame. Tapi kami mungkin tidak tahu ID IMDB saat kami mencari. Sama seperti bekerja dengan tipe data standar, Anda dapat menggunakan data dari dalam dokumen Anda dalam klausa di mana. Dalam hal ini, kami akan mencari semua film yang dimulai dengan "Avengers"

Kerang

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

mysql> pilih json_column - >>'$.title', json_column - >>'$.imdb_rating', json_column - >>'$.imdb_id' dari movies_json

di mana json_column - >>'$.title' suka 'Avengers%';

 

+-------------------------------------------------

. json_column - >>' . judul'                                    . json_column - >>' . imdb_rating' . json_column - >>' . imdb_id' .

+-------------------------------------------------

. Pembalas. Endgame (2019)                                   < . | 9. 0                           . tt4154796                 .

. Avengers Rahasia. Hitam Janda & Penghukum ( . Video 2014) | 5. 8                           . tt3482378                 .

. Pembalas dari Keadilan. Lelucon Perang (2018) .                      | null                          . tt6172666                 .

. Pembalas. Usia dari Ultron (2015 . )                             | 7. 5                           . tt2395427                 .

. Pembalas. Tak Terbatas Perang (2018) .                               | null                          . tt4154756                 .

. Pembalas Grimm. Waktu Perang (Video 2018 . )                     | null                          . tt8159584                 .

. Avengers Kumpulkan. (TV Serial 2010 – . )                      | null                          . tt1779952                 .

. Avengers Grimm (Video 2015 . )                                | 2. 8                           . tt4296026                 .

+-------------------------------------------------

8 baris di set (0.74 dtk)

Menggunakan “json_column->’$. judul 'di mana klausa memberi kami daftar film dan acara TV berjudul Avengers yang bagus. Namun, Anda dapat melihat dari kueri ini, kami mendapatkan lebih dari sekadar film blockbuster Avengers. Katakanlah Anda ingin menyempurnakannya sedikit lagi dan hanya menemukan film Avengers dengan Robert Downey Jr. dalam pemeran. Ini sedikit lebih sulit, sejujurnya, karena format dokumen JSON kami menggunakan array untuk cast member

Berikut adalah tampilan JSON

Kerang

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

{

  "imdb_id". "tt2395427",

  "tmdb_id". "99861",

  "douban_id". "10741834",

  "judul". "Pembalas. Age of Ultron (2015)",

  "genre". [

    "Aksi",

    "Petualangan",

    "Sci-Fi"

  ],

  "negara". "AS",

  "versi". [

    {

      "waktu proses". "141 mnt",

      "deskripsi". ""

    }

  ],

  "imdb_rating". 7. 5,

  "sutradara". [

    {

      "id". "nm0923736",

      "nama". "Joss Whedon"

    }

  ],

  "penulis". [

    {

      "id". "nm0923736",

      "nama". "Joss Whedon",

      "deskripsi". "ditulis oleh"

    },

    {

      "id". "nm0498278",

      "nama". "Stan Lee",

      "deskripsi". "berdasarkan komik Marvel oleh dan"

    },

    {

      "id". "nm0456158",

      "nama". "Jack Kirby",

      "deskripsi". "berdasarkan komik Marvel oleh"

    }

  ],

  "casting". [

    {

      "id". "nm0000375",

      "nama". "Robert Downey Jr. ",

      "karakter". "Tony Stark"

    },

    {

      "id". "nm1165110",

      "nama". "Chris Hemsworth",

      "karakter". "Thor"

    },

    {

      "id". "nm0749263",

      "nama". "Mark Ruffalo",

      "karakter". "Bruce Banner"

    },

    {

      "id". "nm0262635",

      "nama". "Chris Evans",

      "karakter". "Steve Rogers"

    },

    {

      "id". "nm0424060",

      "nama". "Scarlett Johansson",

      "karakter". "Natasha Romanoff"

    },

    {

      "id". "nm0719637",

      "nama". "Jeremy Renner",

      "karakter". "Clint Barton"

 

Anda dapat mengakses array dalam dokumen JSON dengan mereferensikan indeks spesifik untuk elemen yang Anda inginkan (mis. e. [0]. name ), namun, jika Anda tidak tahu mana yang berisi data yang Anda cari, Anda perlu mencarinya. MySQL memiliki fungsi untuk membantu dalam hal ini (ada fungsi lain seperti json_contains juga). json_search mencari nilai yang diberikan dan akan mengembalikan lokasi jika ditemukan dan null jika tidak ditemukan

Kerang

1

2

3

4

5

6

7

8

9

10

11

12

13

mysql> pilih json_column - >>'$.title',

json_column - >>'$. imdb_rating',

json_column - >>'$. imdb_id' dari movies_json  

di mana json_column - >>'$.title' suka 'Avengers%' dan json_search(json_column->>'$.cast', 'satu','Robert Downey Jr. ', NULL,'$[*]. nama' ) adalah tidak null;

 

+--------------------------------+----------------

. json_column - >>' . judul'        . json_column - >>' . imdb_rating' . json_column - >>' . imdb_id' .

+--------------------------------+----------------

. Pembalas. Permainan Akhir (2019)       < . | 9                             . tt4154796                 .

. Pembalas. Usia dari Ultron (2015 . ) | 7. 5                           . tt2395427                 .

. Pembalas. Tak Terbatas Perang (2018) .   | null                          . tt4154756                 .

+--------------------------------+----------------

3 baris di set (0.79 dtk)

Anda akan melihat bahwa saya menggunakan parameter 'satu', ini menemukan nilai pertama. Anda juga dapat menggunakan 'semua' untuk mengembalikan setiap nilai yang cocok. Jika Anda penasaran dengan apa yang sebenarnya dikembalikan json_search di sini adalah hasilnya

Kerang

1

2

3

4

5

6

7

8

9

10

11

12

13

mysql>  pilih json_column->>'$.title' sebagai judul,

        json_search(json_column - >>'$.cast', 'satu','Robert Downey Jr. ') sebagai search_output

    dari movies_json  di mana json_column->>'$.title' suka 'Avengers%'

dan json_search(json_column - >>'$.cast', 'satu','Robert Downey Jr. ', NULL,'$[*]. nama' ) adalah tidak null;

 

+--------------------------------+-----------------------------+

. judul                          . search_output .

+--------------------------------+-----------------------------+

. Pembalas. Permainan Akhir (2019)       < . | "$[0]. nama"   .

. Pembalas. Usia dari Ultron (2015 . ) | "$[0]. nama"   .

. Pembalas. Tak Terbatas Perang (2018) .   | "$[0]. nama"   .

+--------------------------------+-----------------------------+

3 baris di set (0.72 dtk)

Anda dapat melihatnya mengembalikan posisi dan properti yang berisi nilai. Output ini berguna untuk berbagai alasan. Salah satunya adalah jika Anda perlu menemukan nilai indeks mana yang berisi teks tertentu itu. Pada contoh pencarian film Robert Downey JR, kita dapat menggunakan informasi indeks ini untuk mengembalikan karakter yang dimainkannya di setiap film. Cara pertama yang saya lihat ini dilakukan membutuhkan sedikit pertengkaran yang tidak suci tetapi

Kerang

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

mysql> pilih json_column - >>'$.title' sebagai judul,

    json_column - >>'$.imdb_rating' sebagai Peringkat,

    json_column - >>'$.imdb_id' sebagai IMDB_ID,

json_extract(json_column - >>'$.cast',concat(substr(json_unquote(json_search(json_column->>'$.cast', 'one','Robert Downey Jr. ')),1,

     - > cari('.',json_unquote(json_search . pemeran'json_column->>'$.cast', 'satu','Robert Downey Jr. ')))),'character')) as Char_played

    dari movies_json  di mana json_column->>'$.title' suka 'Avengers%' dan json_search(json_column->>'$.cast', 'satu','Robert Downey Jr. ') adalah tidak nol;

 

 

+-----------------------+-----------------------+-------

. judul                          . Peringkat . IMDB_ID   . Char_dimainkan                          .

+-----------------------+-----------------------+-------

. Pembalas. Permainan Akhir (2019)       < . | 9      . tt4154796 . "Tony Stark /              Iron Man" .

. Pembalas. Usia dari Ultron (2015 . ) | 7. 5    . tt2395427 . "Tony Stark"                         .

. Pembalas. Tak Terbatas Perang (2018) .   | null   . tt4154756 . "Tony Stark /              Iron Man" .

+-----------------------+-----------------------+-------

3 baris di set (0.68 dtk)

Di sini saya menemukan di mana dalam dokumen Robert Downey Jr terdaftar, kemudian mengekstraksi indeks dan menggunakannya dengan fungsi Ekstrak JSON untuk mengeluarkan nilai “$[0]. karakter” bukannya “$[0]. nama". Sementara ini bekerja, itu jelek. MySQL menyediakan alternatif untuk melakukan ini dengan menggunakan json_table

Kerang

1

2

3

4

5

6

7

8

9

10

11

12

13

14

mysql> pilih json_column - >>'$.title',  json_column - . imdb_rating'>'$.imdb_rating', t. * dari movies_json, json_table . cor[*]'(json_column, '$.cast[*]' kolom(

       V_name varchar(200) path '$.name',

       V_character varchar(200) path '$.character')

       ) t di mana t.V_name suka 'Robert Downey Jr. %' dan json_column - >>'$.title' suka 'Avengers%';

 

 

+--------------------------------+----------------

. json_column - >>' . judul'        . json_column - >>' . imdb_rating' . V_name            . V_character                        .

+--------------------------------+----------------

. Pembalas. Permainan Akhir (2019)       < . | 9                             . Robert Downey Jr. . Tony Stark /               Besi < . Man |

. Pembalas. Usia dari Ultron (2015 . ) | 7. 5                           . Robert Downey Jr. . Tony Stark                         .

. Pembalas. Tak Terbatas Perang (2018) .   | null                          . Robert Downey Jr. . Tony Stark /               Besi < . Man |

+--------------------------------+----------------

3 baris di set (0.74 dtk)

Pada dasarnya, json_table mengambil array dan mengubahnya menjadi objek tabel, memungkinkan Anda untuk bergabung dan menanyakannya. Anda juga dapat menggunakan ini untuk membuat daftar semua karakter yang dimainkan aktor dalam film apa pun dalam kariernya. Ini adalah bagian kedua dari seri ini, saat kami akan menunjukkan kepada Anda beberapa cara yang lebih mudah dan cepat untuk menggunakan JSON dari dalam MySQL

Apakah JSON didukung di MySQL?

MySQL mendukung tipe data JSON asli yang ditentukan oleh RFC 7159 yang memungkinkan akses efisien ke data dalam dokumen JSON (JavaScript Object Notation). Tipe data JSON memberikan keunggulan ini dibandingkan menyimpan string berformat JSON dalam kolom string. Validasi otomatis dokumen JSON disimpan di kolom JSON.

Apakah MySQL5. 7 mendukung tipe data JSON?

Kecuali dinyatakan sebaliknya, fungsi JSON ditambahkan di MySQL 5. 7. 8 . Serangkaian fungsi spasial untuk mengoperasikan nilai GeoJSON juga tersedia.

Apakah MySQL5. 6 mendukung JSON?

- Mendukung semua tipe JSON – Numbers , string, Bool , objek & array.

Bisakah kita memasukkan JSON di MySQL?

Perhatikan bahwa basis data apa pun akan menerima dokumen JSON sebagai blob string tunggal. Namun, MySQL dan PostgreSQL mendukung data JSON yang divalidasi dalam pasangan kunci/nilai nyata, bukan string dasar .