[JAVA] Speichern Sie UUID-Daten in MySQL als 16 Byte

Es gibt ähnliche Geschichten an verschiedenen Orten, aber ich werde sie für mein eigenes Verständnis und Memorandum schreiben.

Über UUID

https://ja.wikipedia.org/wiki/UUID

Das ursprüngliche Vorkommen ist in Wikipedia usw. zu sehen und wird im tatsächlichen Betrieb häufig verwendet, wenn Daten während der Entwicklung eine eindeutige ID zugewiesen wird.

Es gibt mehrere Versionen von UUID. Die eine, die in der Entwicklung am häufigsten verwendet wird, ist ** UUID Version 4 (zufällig generiert) ** und die andere ** Version 1 (generiert unter Verwendung von Mac-Adressen und Zeitstempelinformationen). ** und so weiter.

Die Bitbreite beträgt ** 128 Bit (16 Bytes) ** und wird in hexadezimaler Schreibweise wie folgt ausgedrückt. (32 Bytes + Grenze 4 Bytes = 36 Bytes. "-" Ist die Grenzzeichenfolge)

550e8400-e29b-41d4-a716-446655440000

Speichern Sie mit SQL (16,0 und früher) mit 16 Byte in MySQL.

Beim Speichern in MySQL mit 16 Byte wird die UUID der hexadezimalen Zeichenfolgendarstellung abzüglich der Grenzzeichenfolge in Binär konvertiert und gespeichert. In SQL ausgedrückt sieht es so aus:

CREATE TABLE `sada ` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,
  `UUID VARBINARY(16) NOT NULL,
  `name` VARCHAR(1024) NOT NULL,
  PRIMARY KEY (`id`)
)
  ENGINE = InnoDB,
  CHARACTER SET = `utf8mb4`, COLLATE = `utf8mb4_bin`;
INSERT INTO sada (
    uuid,
    name
)
VALUES(
    UNHEX(REPLACE('550e8400-e29b-41d4-a716-446655440000', '-', '')),
    'masashi'
);

Speichern Sie mit SQL (16,0 oder höher) mit 16 Byte in MySQL.

Ab MySQL 8 wurden Funktionen zum Bearbeiten von UUIDs hinzugefügt. Wenn Sie 8 oder höher verwenden, können Sie dies verwenden, um die ursprüngliche Verarbeitung zu entfernen, die Sie verwirrt.

https://mysqlserverteam.com/mysql-8-0-uuid-support/

--UUID_TO_BIN (UUID-Zeichenfolge in Binär konvertieren) --BIN_TO_UUID (Binär in UUID-Zeichenfolge konvertieren)

Das Beispiel zitiert den offiziellen Blog oben.

CREATE TABLE t (id binary(16) PRIMARY KEY);

INSERT INTO t VALUES(UUID_TO_BIN(UUID()));
Query OK, 1 row affected (0,00 sec)

#a few inserts later..

SELECT BIN_TO_UUID(id) FROM t;
+--------------------------------------+
| BIN_TO_UUID(id); |
+--------------------------------------+
| 586bcc2d-9a96-11e6-852c-4439c456d444 |
| 5942e49a-9a96-11e6-852c-4439c456d444 |
| 841ae775-9a96-11e6-852c-4439c456d444 |
| 84393c8e-9a96-11e6-852c-4439c456d444 |
| af0f27e2-9aad-11e6-852c-4439c456d444 |
+--------------------------------------+
5 rows in set (0,00 sec)

Speichern Sie mit Java / Kotlin mit 16 Byte in MySQL

Aus dem Programm können die in jeder Sprache generierten UUID-Informationen binär in 16 Bytes per Binär gespeichert werden.

Hier wird nur das Kotlin-Beispiel gezeigt. Da die UUID-Klasse in Java / Kotlin vorhanden ist, ist es in Ordnung, wenn Sie die Konvertierungslogik vom UUID-Typ-> Byte-Array und Byte-Array-> UUID-Typ wie unten gezeigt erstellen und sie entsprechend der zu verwendenden Umgebung (ORM usw.) einbinden. ist.

    fun uuidToBytes(uuid: UUID): ByteArray {
        val buffer = ByteBuffer.allocate(16)
        buffer.putLong(uuid.mostSignificantBits)
        buffer.putLong(uuid.leastSignificantBits)
        return buffer.array()
    }

    fun bytesToUuid(bytes: ByteArray?): UUID? {
        if (bytes == null) {
            return null
        }
        val buffer = ByteBuffer.wrap(bytes)
        return UUID(buffer.long, buffer.long)
    }

Anhang. Kleinere ID-Darstellung

Da UUID eine ziemlich große ID-Darstellung mit 16 Bytes ist, gibt es meiner Meinung nach eine Möglichkeit, eine größere ID zu verwenden, anstatt zu versuchen, durch Speichern der UUID Größe zu sparen. Das Folgende dient nur als Referenz.

[Über den leichten zeitbasierten ID-Generator "Shakeflake (vorläufiger Name)"](https://developer.smartnews.com/blog/2013/07/31/shakeflake-is-a-tool-for-generating-unique- ID-Nummern /)

Recommended Posts

Speichern Sie UUID-Daten in MySQL als 16 Byte
Worauf ich in MySQL 5.5-> 5.7 gestoßen bin
twitter4j java Speichern Sie die gesuchten Tweets in DB (MySQL).
Erstellen Sie in 5 Minuten eine MySQL-Testumgebung (+ Millionen von Testdaten)
Importieren Sie Excel-Daten mit Java 2
Importieren Sie Excel-Daten mit Java
Importieren Sie Excel-Daten mit Java 3
Geben Sie den MySQL-Socket in Hanami an