Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL mengonversi tipe data CHAR(32) ke BINARY(16) tanpa kehilangan data

Sepertinya Anda ingin UUID direpresentasikan sebagai string digit heksadesimal. Ini biasanya memiliki empat tanda hubung di dalamnya sehingga panjangnya sebenarnya 36 karakter. Tetapi jika Anda menghapus tanda hubung, itu bisa menjadi 32 karakter.

mysql> SELECT UUID();
+--------------------------------------+
| UUID()                               |
+--------------------------------------+
| b4d841ec-5220-11e9-901f-a921a9eb9f5b |
+--------------------------------------+

mysql> SELECT REPLACE(UUID(), '-', '');
+----------------------------------+
| REPLACE(UUID(), '-', '')         |
+----------------------------------+
| d3dbd450522011e9901fa921a9eb9f5b |
+----------------------------------+

Tetapi dalam string hex, masing-masing dua karakter mewakili data yang dapat dikodekan dalam satu byte data biner. Misalnya, FF adalah nilai hex untuk 255, yang merupakan nilai maksimum satu byte. Oleh karena itu string hex mengambil dua kali lebih banyak byte sebagai data yang setara dalam biner. Jika ruang dibatasi, Anda mungkin ingin mengonversi nilai UUID ke biner sehingga Anda dapat menyimpannya di setengah ruang.

Anda dapat melakukannya dengan UNHEX() fungsi .

mysql> SELECT UNHEX(REPLACE(UUID(), '-', ''));
+---------------------------------+
| UNHEX(REPLACE(UUID(), '-', '')) |
+---------------------------------+
| $S,vR!??!??[                      |
+---------------------------------+

Data biner tidak menyenangkan untuk ditampilkan atau diketik dalam antarmuka berorientasi manusia, karena beberapa byte sesuai dengan karakter yang tidak dapat dicetak.

Tetapi ketika Anda melakukan ALTER TABLE table_name MODIFY device_uuid BINARY(16) , Anda tidak memecahkan kode string hex dengan UNHEX() . Paling-paling, ini menyebabkan 16 byte pertama karakter heksadesimal ASCII dipetakan ke 16 byte kolom BINARY(16) Anda, dan string itu terpotong pada saat itu. Seolah-olah Anda melakukan ini pada setiap baris:

mysql> SELECT LEFT(REPLACE(UUID(), '-', ''), 16);
+------------------------------------+
| LEFT(REPLACE(UUID(), '-', ''), 16) |
+------------------------------------+
| 364e6db8522211e9                   |
+------------------------------------+

16 byte pertama masih berupa angka heksadesimal. Byte adalah nilai ASCII untuk digit tersebut, bukan ekuivalen biner dari setiap pasangan digit. 16 byte terakhir dari setiap string terpotong, dan tidak disimpan. Jika data itu penting, saya harap Anda memiliki cadangan database Anda, karena memulihkan cadangan itu sekarang adalah satu-satunya cara Anda dapat memulihkan data itu.

Yang seharusnya Anda lakukan adalah sebagai berikut:

ALTER TABLE table_name ADD COLUMN device_uuid_bin BINARY(16);
UPDATE table_name SET device_uuid_bin = UNHEX(device_uuid);

...check the data to make sure the conversion worked... 
...test any applications work with the binary data... 

ALTER TABLE table_name DROP COLUMN device_uuid;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. jquery php masukkan data ke mysql tanpa menyegarkan halaman

  2. Sisipkan mysql_real_escape_string ganda dari karakter baris baru. Bagaimana cara mendapatkan jeda baris baru kembali?

  3. Hibernate OneToOne pemuatan lambat dan cascading

  4. Model hierarki mana yang harus saya gunakan? Adjacency, Nested, atau Enumerated?

  5. Memperbarui baris di jOOQ dengan bergabung