全部产品
Search
文档中心

PolarDB:Protobuf yang Dapat Dibaca

更新时间:Jul 06, 2025

Fitur Protobuf yang dapat dibaca telah ditambahkan di PolarDB for MySQL. Untuk bidang bertipe BLOB yang diserialisasi menggunakan Protobuf dan disimpan dalam database, Anda dapat mengonfigurasi skema Protobuf untuk mereka serta menggunakan fungsi PROTO_TO_JSON(blob_field) untuk membaca data mereka. Selain itu, Anda dapat menggunakan fungsi JSON_EXTRACT() untuk mengekstrak informasi tertentu dari data guna membuat indeks atau kolom virtual.

Informasi latar belakang

Di industri game, beberapa data diserialisasi menggunakan Protobuf dan bahkan dikompres menggunakan zlib sebelum disimpan ke dalam bidang bertipe BLOB di database. Data bertipe BLOB dalam database tidak dapat dibaca secara langsung, sehingga menyulitkan proses debugging dan pengembangan perangkat lunak. Bahkan dalam skenario analisis data, komponen tambahan diperlukan untuk membaca data tersebut.

Fungsi Protobuf yang dapat dibaca yang disediakan oleh PolarDB for MySQL memungkinkan visualisasi data yang diserialisasi menggunakan Protobuf dan dikompres menggunakan zlib tanpa memerlukan komponen tambahan.

Prasyarat

Kluster PolarDB harus menggunakan versi PolarDB for MySQL 8.0 dengan revisi versi 8.0.2.2.5 atau lebih baru. Untuk informasi lebih lanjut tentang cara memeriksa versi kluster, lihat Kueri versi mesin.

Penggunaan

  • Configure a Protobuf schema
    Syntax
    ALTER TABLE nama_tabel ALTER COLUMN nama_kolom
    [PROTO_NAME = nama_skema_protobuf]
    PROTO_TEXT = definisi_skema_protobuf
    PROTO_MESSAGE = pesan_serialisasi_protobuf
    [COMPRESSION = algoritma_kompresi]
    Parameters
    ParameterWajibDeskripsi
    PROTO_NAME TidakNama skema Protobuf.
    PROTO_TEXT YaDefinisi skema Protobuf.
    PROTO_MESSAGE YaPesan serialisasi Protobuf.
    COMPRESSION TidakParameter ini hanya diperlukan jika data pesan serialisasi Protobuf dikompres menggunakan zlib sebelum ditulis ke dalam database. Atur nilainya menjadi zlib.
    Catatan Data yang dikompres dengan zlib dapat didekompres menggunakan fungsi UNCOMPRESS() menjadi data heksadesimal.
  • Remove the Protobuf schema definition of a field
    Anda dapat mengosongkan parameter PROTO_TEXT untuk menghapus definisi skema Protobuf suatu bidang. Jalankan pernyataan berikut:
    ALTER TABLE nama_tabel ALTER COLUMN nama_kolom PROTO_NAME="" PROTO_TEXT="" PROTO_MESSAGE=''; 
    Catatan Sebelum menghapus definisi skema Protobuf suatu bidang, pastikan bahwa bidang tersebut telah dilepaskan dari indeks dan kolom virtual.
  • View the Protobuf schema definition of a field
    1. Jalankan pernyataan berikut untuk mengatur parameter display_readable_proto_info menjadi true:
      SET display_readable_proto_info=true;
    2. Jalankan pernyataan berikut untuk melihat definisi skema Protobuf suatu bidang:
      SHOW columns FROM nama_tabel

Contoh

Contoh berikut menjelaskan cara menggunakan fitur Protobuf yang dapat dibaca serta cara menggunakan fungsi PROTO_TO_JSON(blob_field) untuk mengekstrak informasi tertentu dari data guna membuat indeks atau kolom virtual. Tabel t1 digunakan dalam contoh-contoh ini.
  1. Buat tabel bernama t1. Jalankan pernyataan berikut:
    CREATE TABLE t1(c1 INT, c2 BLOB);
    Bidang c2 bertipe BLOB dan diserialisasi menggunakan Protobuf.
  2. Tambahkan definisi skema Protobuf untuk bidang c2.
    Contoh di mana addressbook.proto dari komunitas Protobuf digunakan:
    syntax = "proto2";
    
    package tutorial;
    
    message Person {
    optional string name = 1;
    optional int32 id = 2;
    optional string email = 3;
    
    enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
    }
    
    message PhoneNumber {
    optional string number = 1;
    optional PhoneType type = 2 [default = HOME];
    }
    
    repeated PhoneNumber phones = 4;
    }
    
    message AddressBook {
    repeated Person people = 1;
    }
    • Contoh di mana data tidak dikompres menggunakan zlib:
      ALTER TABLE t1 ALTER COLUMN c2 PROTO_NAME="AddressBook" PROTO_TEXT="syntax = \"proto2\";\n\npackage tutorial;\n\nmessage Person {\n  optional string name = 1;\n  optional int32 id = 2;\n  optional string email = 3;\n\n  enum PhoneType {\n    MOBILE = 0;\n    HOME = 1;\n    WORK = 2;\n  }\n\n  message           PhoneNumber {\n    optional string number = 1;\n    optional PhoneType type = 2 [default = HOME];\n  }\n\n  repeated PhoneNumber phones = 4;\n}\n\nmessage  AddressBook {\n  repeated Person people = 1;\n}" PROTO_MESSAGE='AddressBook';
    • Contoh di mana data dikompres menggunakan zlib:
      ALTER TABLE t1 ALTER COLUMN c2 PROTO_NAME="AddressBook" PROTO_TEXT="syntax = \"proto2\";\n\npackage tutorial;\n\nmessage Person {\n  optional string name = 1;\n  optional int32 id = 2;\n  optional string email = 3;\n\n  enum PhoneType {\n    MOBILE = 0;\n    HOME = 1;\n    WORK = 2;\n  }\n\n  message           PhoneNumber {\n    optional string number = 1;\n    optional PhoneType type = 2 [default = HOME];\n  }\n\n  repeated PhoneNumber phones = 4;\n}\n\nmessage  AddressBook {\n  repeated Person people = 1;\n}" PROTO_MESSAGE='AddressBook' COMPRESSION='zlib';
  3. Tulis data yang diserialisasi menggunakan Protobuf ke tabel t1.
    • Contoh di mana data tidak dikompres menggunakan zlib:
      INSERT INTO t1 VALUES(1, X'0a380a0b56697375616c50726f746f10011a1776697375616c70726f746f40706f6c617264622e636f6d220e0a0a313233343536373839301002');
    • Contoh di mana data dikompres menggunakan zlib:
      INSERT INTO t1 VALUES(1, X'3C000000785ee3b2e0e20ecb2c2e4dcc0928ca2fc9176094122f03730b405c8782fc9cc4a29424bde4fc5c253e2e2e432363135333730b4b03012600183d10de');
      Data yang dikompres dengan zlib dapat didekompres menggunakan fungsi UNCOMPRESS(). Contoh di mana data dikompres menggunakan zlib:
      SELECT HEX(uncompress(X'3C000000785ee3b2e0e20ecb2c2e4dcc0928ca2fc9176094122f03730b405c8782fc9cc4a29424bde4fc5c253e2e2e432363135333730b4b03012600183d10de')) AS UNCOMPRESS_DATA;
      Hasil sampel data heksadesimal yang didekompres:
      +----------------------------------------------------------------------------------------------------------------------+
      | UNCOMPRESS_DATA                                                                                                      |
      +----------------------------------------------------------------------------------------------------------------------+
      | 0A380A0B56697375616C50726F746F10011A1776697375616C70726F746F40706F6C617264622E636F6D220E0A0A313233343536373839301002 |
      +----------------------------------------------------------------------------------------------------------------------+
  4. Baca data di kolom c2 atau ekstrak data dari kolom c2 untuk membuat indeks atau kolom virtual.
    • Baca data di kolom c2.
      • Baca data di kolom c2 ketika fungsi PROTO_TO_JSON(blob_field) tidak digunakan.
        • Jika data tidak dikompres menggunakan zlib, jalankan pernyataan berikut untuk membaca data dari kolom c2:
          SELECT c2 FROM t1\G
          Hasil sampel data yang dibaca:
          *************************** 1. row ***************************
          c2:
          8
          
          VisualProtovisualproto@polardb.com"
          
          1234567890
        • Jika data dikompres menggunakan zlib, jalankan pernyataan berikut untuk membaca data di kolom c2:
          SELECT c2 FROM t1\G
          Hasil sampel data yang dibaca:
          *************************** 1. row ***************************
          c2: <   x^����,. M�    (�/�'�/s
                                          @\����$���\%>..C#cS3s
                                                                K& =�
      • Baca data di kolom c2 ketika fungsi PROTO_TO_JSON(blob_field) digunakan.
        SELECT PROTO_TO_JSON(c2) FROM t1;
        Hasil sampel data yang dibaca:
        +------------------------------------------------------------------------------------------------------------------------------------------+
        | PROTO_TO_JSON(c2)                                                                                                                        |
        +------------------------------------------------------------------------------------------------------------------------------------------+
        | {"people": [{"id": 1, "name": "VisualProto", "email": "visualproto@polardb.com", "phones": [{"type": "WORK", "number": "1234567890"}]}]} |
        +------------------------------------------------- ----------------------------------------------------------------------+
        Catatan Fungsi PROTO_TO_JSON(blob_field) dapat membaca baik data yang dikompres menggunakan zlib maupun data yang tidak dikompres menggunakan zlib.
      • Gunakan fungsi JSON untuk mengekstrak data di kolom c2. Contoh:
        SELECT json_extract(PROTO_TO_JSON(c2), '$.people[0].name') FROM t1;
        Hasil sampel data yang diekstrak:
        +-----------------------------------------------------+
        | json_extract(PROTO_TO_JSON(c2), '$.people[0].name') |
        +-----------------------------------------------------+
        | "VisualProto"                                       |
        +-----------------------------------------------------+
    • Ekstrak data di kolom c2 untuk membuat indeks. Contoh:
      CREATE INDEX i_email ON t1((cast(JSON_UNQUOTE(json_extract(PROTO_TO_JSON(c2), '$.people[0].email')) AS char(100))));
      Jalankan pernyataan EXPLAIN untuk memeriksa kinerja eksekusi pernyataan SQL sebelumnya. Contoh:
      EXPLAIN SELECT * FROM t1 WHERE (cast(JSON_UNQUOTE(json_extract(PROTO_TO_JSON(c2), '$.people[0].ema
      Hasil sampel:
      +----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+
      | id | select_type | table | partitions | type | possible_keys | key     | key_len | ref   | rows | filtered | Extra |
      +----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+
      |  1 | SIMPLE      | t1    | NULL       | ref  | i_email       | i_email | 403     | const |    1 |   100.00 | NULL  |
      +----+-------------+-------+------------+------+---------------+---------+---------+-------+------+----------+-------+
    • Ekstrak data di kolom c2 untuk membuat kolom virtual. Contoh:
      ALTER TABLE t1 ADD COLUMN c3 varchar(100) AS (json_extract(proto_to_json(`c2`), _utf8mb4'$.people[0].email'));
      Jalankan pernyataan berikut untuk melihat skema tabel t1:
      desc t1;
      Skema sampel tabel t1:
      +-------+--------------+------+-----+---------+-------------------+
      | Field | Type         | Null | Key | Default | Extra             |
      +-------+--------------+------+-----+---------+-------------------+
      | c1    | int(11)      | YES  |     | NULL    |                   |
      | c2    | blob         | YES  |     | NULL    |                   |
      | c3    | varchar(100) | YES  |     | NULL    | VIRTUAL GENERATED |
      +-------+--------------+------+-----+---------+-------------------+
      c3 adalah kolom virtual yang baru dibuat.