Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL chuyển đổi kiểu dữ liệu CHAR (32) thành BINARY (16) mà không làm mất dữ liệu

Có vẻ như bạn muốn có một UUID được biểu diễn dưới dạng một chuỗi các chữ số thập lục phân. Chúng thường có bốn dấu gạch ngang nên độ dài thực sự là 36 ký tự. Nhưng nếu bạn xóa dấu gạch ngang, nó có thể là 32 ký tự.

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

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

Nhưng trong một chuỗi hex, mỗi hai ký tự đại diện cho dữ liệu có thể được mã hóa trong một byte dữ liệu nhị phân. Ví dụ, FF là giá trị hex cho 255, là giá trị lớn nhất của một byte. Do đó, chuỗi hex mất gấp đôi số byte so với dữ liệu tương đương trong hệ nhị phân. Nếu không gian bị hạn chế, bạn có thể muốn chuyển đổi các giá trị UUID của mình thành nhị phân để có thể lưu trữ chúng trong một nửa không gian.

Bạn có thể thực hiện việc này bằng hàm UNHEX () .

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

Dữ liệu nhị phân không dễ hiển thị hoặc nhập vào các giao diện hướng về con người, vì một số byte tương ứng với các ký tự không in được.

Nhưng khi bạn thực hiện ALTER TABLE table_name MODIFY device_uuid BINARY(16) , bạn đã không giải mã chuỗi hex bằng UNHEX() . Tốt nhất, điều này khiến 16 byte đầu tiên của ký tự thập lục phân ASCII được ánh xạ tới 16 byte của cột BINARY (16) của bạn và nó đã cắt ngắn chuỗi tại thời điểm đó. Cứ như thể bạn đã làm điều này với mọi hàng:

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

16 byte đầu tiên vẫn là chữ số thập lục phân. Các byte là giá trị ASCII cho các chữ số đó, không phải là giá trị nhị phân tương đương của mỗi cặp chữ số. 16 byte sau của mỗi chuỗi đã bị cắt bớt và không được lưu trữ. Nếu dữ liệu đó quan trọng, tôi hy vọng bạn có một bản sao lưu cơ sở dữ liệu của mình, bởi vì khôi phục bản sao lưu đó hiện là cách duy nhất bạn có thể khôi phục dữ liệu đó.

Những gì bạn nên làm là như sau:

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. Làm thế nào để xác định xem một truy vấn MySQL là hợp lệ?

  2. 1093 Lỗi trong bảng MySQL được chỉ định hai lần

  3. kết nối trái nhân các giá trị

  4. Chọn giá trị cột của bảng nối làm tên cột kết quả

  5. Kết hợp hai truy vấn MYSQL SELECT