UUIDを16進数の文字列として表現したいようです。これらには通常4つのダッシュが含まれているため、長さは実際には36文字です。ただし、ダッシュを削除すると、32文字になる可能性があります。
mysql> SELECT UUID();
+--------------------------------------+
| UUID() |
+--------------------------------------+
| b4d841ec-5220-11e9-901f-a921a9eb9f5b |
+--------------------------------------+
mysql> SELECT REPLACE(UUID(), '-', '');
+----------------------------------+
| REPLACE(UUID(), '-', '') |
+----------------------------------+
| d3dbd450522011e9901fa921a9eb9f5b |
+----------------------------------+
ただし、16進文字列では、各2文字は、1バイトのバイナリデータにエンコードできるデータを表します。たとえば、FFは255の16進値であり、1バイトの最大値です。したがって、16進文字列は、バイナリの同等のデータの2倍のバイト数を使用します。スペースに制約がある場合は、UUID値をバイナリに変換して、スペースの半分に格納できるようにすることをお勧めします。
これは、 UNHEX()関数を使用して行うことができます 。
mysql> SELECT UNHEX(REPLACE(UUID(), '-', ''));
+---------------------------------+
| UNHEX(REPLACE(UUID(), '-', '')) |
+---------------------------------+
| $S,vR!??!??[ |
+---------------------------------+
一部のバイトは印刷できない文字に対応しているため、バイナリデータは人間向けのインターフェイスで表示または入力するのは快適ではありません。
ただし、ALTER TABLE table_name MODIFY device_uuid BINARY(16)
を実行した場合 、UNHEX()
で16進文字列をデコードしませんでした 。せいぜい、これにより、ASCII 16進文字の最初の16バイトがBINARY(16)列の16バイトにマップされ、その時点で文字列が切り捨てられました。すべての行に対してこれを行ったかのようです:
mysql> SELECT LEFT(REPLACE(UUID(), '-', ''), 16);
+------------------------------------+
| LEFT(REPLACE(UUID(), '-', ''), 16) |
+------------------------------------+
| 364e6db8522211e9 |
+------------------------------------+
最初の16バイトはまだ16進数です。バイトはそれらの数字のASCII値であり、数字の各ペアに相当する2進数ではありません。すべての文字列の後半の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;