MySQL/MariaDBでは、uuidを保存する最も効率的な方法はBINARY(16)カラムです。ただし、フォーマットされたuuid文字列として取得したい場合があります。
次のテーブル構造を考えると、デフォルトのフォーマットされた方法ですべてのuuidを取得するにはどうすればよいですか?
CREATE TABLE foo (uuid BINARY(16));
次は、私が求めていた結果を作成します。
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;
MySQL 8が追加します 2つの新しいUUID関数 :
そう:
SELECT BIN_TO_UUID(uuid) FROM foo
以前の(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)
反対、つまり文字列からバイナリに変換する方法を探している場合は、おそらく結合または何かを行うために、これはここでカバーされています: ノードのバイナリを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)
))
_
以下のスクリプトによって正しい結果が生成され、他のスクリプトは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が生成されました。
2e9660c2-1e51-4b9e-9a86-6db1a2770422
c260962e-511e-9e4b-9a86-6db1a2770422
ご覧のとおり、それらは異なっています。
生の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;