sql >> Database teknologi >  >> RDS >> Mysql

MySQL konverter CHAR(32) datatype til BINARY(16) uden at miste data

Det lyder som om du vil have et UUID repræsenteret som en streng af hexadecimale cifre. Disse har normalt fire tankestreger i dem, så længden er faktisk 36 tegn. Men hvis du fjerner stregerne, kan det være på 32 tegn.

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

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

Men i en hex-streng repræsenterer hver to tegn data, der kunne kodes i en byte af binære data. For eksempel er FF hex-værdien for 255, som er den maksimale værdi af en byte. Derfor tager hex-strenge dobbelt så mange bytes som de tilsvarende data i binær. Hvis pladsen er begrænset, vil du måske konvertere dine UUID-værdier til binære, så du kan gemme dem i det halve rum.

Du kan gøre dette med UNHEX()-funktionen .

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

Binære data er ikke behagelige at vise eller skrive i menneskeorienterede grænseflader, fordi nogle bytes svarer til tegn, der ikke kan udskrives.

Men da du gjorde ALTER TABLE table_name MODIFY device_uuid BINARY(16) , du afkodede ikke hex-strengene med UNHEX() . I bedste fald forårsagede dette, at de første 16 bytes af ASCII hexadecimale tegn blev afbildet til de 16 bytes i din BINARY(16) kolonne, og det afkortede strengen på det tidspunkt. Det er, som om du gjorde dette til hver række:

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

De første 16 bytes er stadig hexadecimale cifre. Bytene er ASCII-værdier for disse cifre, ikke den binære ækvivalent af hvert par cifre. De sidste 16 bytes af hver streng blev trunkeret og ikke gemt. Hvis disse data var vigtige, håber jeg, at du har en sikkerhedskopi af din database, for gendannelse af den sikkerhedskopi er nu den eneste måde, du kan gendanne disse data på.

Hvad du skulle have gjort er følgende:

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. Søg efter flere søgeord

  2. Vælg data mellem to datoer ekskluder nogle dage

  3. MySQL Workbench:hvordan viser man advarsler?

  4. R:[unixODBC][Driver Manager]Kan ikke åbne lib 'SQL Server':fil blev ikke fundet