web-dev-qa-db-ja.com

MySQL / MariaDBのバイナリ列からuuid文字列をフォーマットする方法

MySQL/MariaDBでは、uuidを保存する最も効率的な方法はBINARY(16)カラムです。ただし、フォーマットされたuuid文字列として取得したい場合があります。

次のテーブル構造を考えると、デフォルトのフォーマットされた方法ですべてのuuidを取得するにはどうすればよいですか?

CREATE TABLE foo (uuid BINARY(16));
20
Lilleman

次は、私が求めていた結果を作成します。

SELECT
  LOWER(CONCAT(
    SUBSTR(HEX(uuid), 1, 8), '-',
    SUBSTR(HEX(uuid), 9, 4), '-',
    SUBSTR(HEX(uuid), 13, 4), '-',
    SUBSTR(HEX(uuid), 17, 4), '-',
    SUBSTR(HEX(uuid), 21)
  ))
FROM foo;
43
Lilleman

MySQL 8が追加します 2つの新しいUUID関数

そう:

SELECT BIN_TO_UUID(uuid) FROM foo
9
Oleg Mikheev

以前の(8より前の)バージョンでは、MySQLで function を次のように作成できます。

CREATE
  FUNCTION uuid_of(uuid BINARY(16))
  RETURNS VARCHAR(36)
  RETURN LOWER(CONCAT(
  SUBSTR(HEX(uuid), 1, 8), '-',
  SUBSTR(HEX(uuid), 9, 4), '-',
  SUBSTR(HEX(uuid), 13, 4), '-',
  SUBSTR(HEX(uuid), 17, 4), '-',
  SUBSTR(HEX(uuid), 21)
));

そして、クエリでそれを使用するだけです:

SELECT
  uuid_of(id)
  name,
  age
FROM users

そして、それは生成します:

(c6f5703b-fec2-43fd-8f45-45f06583d450、一部の名前、20)

3
Andrii Abramov

反対、つまり文字列からバイナリに変換する方法を探している場合は、おそらく結合または何かを行うために、これはここでカバーされています: ノードのバイナリをUUIDに変換する

Mysql 5.7で実行されたこのSQLの部分は、私にとってコンセプトのロックに役立ちました。

_SELECT
  LOWER(CONCAT(
    SUBSTR(HEX(UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))), 1, 8), '-',
    SUBSTR(HEX(UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))), 9, 4), '-',
    SUBSTR(HEX(UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))), 13, 4), '-',
    SUBSTR(HEX(UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))), 17, 4), '-',
    SUBSTR(HEX(UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))), 21)
  ))
_

出力は_43d597d7-2323-325a-90fc-21fa5947b9f3_です。

string-> binary

UNHEX(REPLACE('43d597d7-2323-325a-90fc-21fa5947b9f3', '-', ''))は、INSERT/UPDATE/JOIN/SELECTなんでもの間にUUIDをバイナリに変換し、

バイナリ->文字列

_LOWER(CONCAT(
  SUBSTR(HEX(uuid), 1, 8), '-',
  SUBSTR(HEX(uuid), 9, 4), '-',
  SUBSTR(HEX(uuid), 13, 4), '-',
  SUBSTR(HEX(uuid), 17, 4), '-',
  SUBSTR(HEX(uuid), 21)
))
_
2
zayquan

以下のスクリプトによって正しい結果が生成され、他のスクリプトはUUIDを生成しましたが、正しいUUIDは生成しませんでした。

CONCAT(
    substr(hex(Id), 7, 2), substr(hex(Id), 5, 2), substr(hex(Id), 3, 2), substr(hex(Id), 1, 2), '-'
    , substr(hex(Id), 11, 2) , substr(hex(Id), 9, 2) , '-'
    , substr(hex(Id), 15, 2) , substr(hex(Id), 13, 2) , '-'
    , substr(hex(Id), 17, 4) , '-'
    , substr(hex(Id), 21, 12) 
    )

他のスクリプトを実行した結果、次のように間違ったUUIDが生成されました。

  • 期待されるUUID-2e9660c2-1e51-4b9e-9a86-6db1a2770422
  • 生成されたもの-c260962e-511e-9e4b-9a86-6db1a2770422

ご覧のとおり、それらは異なっています。

0
Alex.H

Concat_wsを使用する代替手段を次に示します

生のuuidを変数@xに保存する

SELECT @x := hex(uuid)
FROM foo;

CONCAT_WSおよびSUBSTRを使用して、人間が読めるUUIDを解析します

SELECT
  LOWER(CONCAT_WS('-',
    SUBSTR(@x, 1, 8),
    SUBSTR(@x, 9, 4),
    SUBSTR(@x, 13, 4),
    SUBSTR(@x, 17, 4),
    SUBSTR(@x, 21)
  )) AS uuid;
0
toddsby