sql >> データベース >  >> RDS >> Mysql

MySQLは、データを失うことなくCHAR(32)データ型をBINARY(16)に変換します

    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;
    


    1. foo.barとの照合(終止符/ピリオド付き)

    2. 並行性の問題を処理するための最良の方法

    3. ランダムな名前のテーブルからのSQl更新

    4. 別のサーバー上の SQL データベースを指す USE のような機能はありますか?