MySQL 将 CHAR(32) 数据类型转换为 BINARY(16) 而不会丢失数据

标签 mysql

您好,我有一个表,其中有一列的数据类型为 char(32),我需要将其转换为 BINARY(16) 数据类型。我试过只更改列类型,但这会删除列中的所有数据。

以下代码是我如何更新列的数据类型。这导致我丢失了列中的所有数据。

ALTER TABLE table_name MODIFY device_uuid BINARY(16)

有没有办法在不丢失任何数据的情况下更改列的数据类型并将所有数据转换为新的数据类型。

我这样做的原因是因为我试图检索位于该表中的一些丢失的数据。我需要将数据导入到的表完全相同,但列类型是 BINARY(16) 而不是 CHAR(32)

如果您能提供帮助,在此先感谢您。

最佳答案

听起来你想要一个 UUID 表示为一串十六进制数字。这些通常有四个破折号,所以长度实际上是 36 个字符。但如果去掉破折号,它可以是 32 个字符。

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

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

但是在十六进制字符串中,每两个字符代表可以编码为一个字节的二进制数据的数据。例如,FF 是 255 的十六进制值,它是一个字节的最大值。因此,十六进制字符串占用的字节数是等效二进制数据的两倍。如果空间有限,您可能希望将 UUID 值转换为二进制,以便将它们存储在一半的空间中。

您可以使用 UNHEX() function 来做到这一点.

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

二进制数据在面向人的界面中显示或键入并不令人愉快,因为一些字节对应于不可打印的字符。

但是当您执行 ALTER TABLE table_name MODIFY device_uuid BINARY(16) 时,您没有使用 UNHEX() 解码十六进制字符串。充其量,这会导致 ASCII 十六进制字符的前 16 个字节映射到 BINARY(16) 列的 16 个字节,并在该点截断字符串。就好像你对每一行都这样做了:

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

前 16 个字节仍然是十六进制数字。字节是这些数字的 ASCII 值,而不是每对数字的二进制等效值。每个字符串的后 16 个字节被截断,并且没有存储。如果该数据很重要,我希望您有数据库备份,因为现在恢复该备份是您恢复该数据的唯一方法。

你应该做的是:

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;

关于MySQL 将 CHAR(32) 数据类型转换为 BINARY(16) 而不会丢失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55417627/

相关文章:

php - MySQL 和 PHP 标记

mysql - MySQL 查询 153 秒,我做错了什么?

java - Undertow 与 spring boot 应用程序一起使用时出现问题

java - 没有合适的驱动程序错误

Mysql查找等于某些值但受计数限制的行

mysql - 库存数据库 : Merging Perpetual and Periodic inventory system

当第一个子查询 = 0 时,MySQL UPDATE 不工作

mysql - mysql sql语句不正确

mysql - MAX(总和(票数))|只获得赢家

MySQL Match Against and Group by Multiple 术语