Vergleich der Datenbankspaltentypen in MySQL, PostgreSQL und SQLite? (Cross-Mapping)

74

Ich versuche, eine Möglichkeit zu finden, Spaltentypen in den am häufigsten verwendeten Datenbanken zu verknüpfen : MySQL , PostgreSQL und SQLite .

Folgendes habe ich bisher, aber ich fürchte, es ist noch nicht erledigt, und ich brauche einige Leute mit mehr Erfahrung, die mir helfen, fehlende Typen zu beseitigen.

MySQL                   PostgreSQL          SQLite

TINYINT                 SMALLINT            INTEGER
SMALLINT                SMALLINT
MEDIUMINT               INTEGER
BIGINT                  BIGINT
BIT                     BIT                 INTEGER
_______________________________________________________

TINYINT UNSIGNED        SMALLINT            INTEGER
SMALLINT UNSIGNED       INTEGER
MEDIUMINT UNSIGNED      INTEGER
INT UNSIGNED            BIGINT
BIGINT UNSIGNED         NUMERIC(20)
_______________________________________________________

DOUBLE                  DOUBLE PRECISION    REAL
FLOAT                   REAL                REAL
DECIMAL                 DECIMAL             REAL
NUMERIC                 NUMERIC             REAL
_______________________________________________________

BOOLEAN                 BOOLEAN             INTEGER
_______________________________________________________

DATE                    DATE                TEXT
TIME                    TIME
DATETIME                TIMESTAMP
_______________________________________________________

TIMESTAMP DEFAULT       TIMESTAMP DEFAULT   TEXT
NOW()                   NOW()   
_______________________________________________________

LONGTEXT                TEXT                TEXT
MEDIUMTEXT              TEXT                TEXT
BLOB                    BYTEA               BLOB
VARCHAR                 VARCHAR             TEXT
CHAR                    CHAR                TEXT
_______________________________________________________

columnname INT          columnname SERIAL   INTEGER PRIMARY 
AUTO_INCREMENT                              KEY AUTOINCREMENT
Xeoncross
quelle
Ich würde sagen, und ich denke, das ist die Wahrheit, Cross-Mapping von Datenbanktypen wird nicht empfohlen, da (in meinen Augen) absolut keine Zeit für Cross-Mapping erforderlich ist. Es kann vorkommen, dass Sie PG in My konvertieren müssen, diese jedoch nicht kreuzweise zuordnen müssen.
Julius F
2
Warum nicht SQL Server & Oracle zur Tabelle hinzufügen?
Drew Hall
2
Das Ziel dieser Kreuzkarte von Spaltentypen ist es, die Erklärung (oder sogar Verwendung) von CREATE TABLEDefinitionen zwischen diesen drei Typen erheblich zu vereinfachen . Da sie häufig verwendet werden, muss Open Source-Code für jeden von ihnen bereit sein.
Xeoncross
@Xeoncross, vielleicht könnten Sie Ihr Diagramm mit meinen Vorschlägen aktualisieren? insb. Das fehlende INTEGER-, VARCHAR- und CHAR-Zeug muss hinzugefügt werden. Ich denke, meine anderen Vorschläge sind auch gültig, aber nicht so wichtig.
Roland Bouman
@ Roland, sorry mit Weihnachten und alles, was ich ein wenig beschäftigt war. Fest.
Xeoncross

Antworten:

16

Liste der Dinge, die ich anders machen würde:

MEDIUMINT in MySQL ist eine ungerade Ente (3 Bytes). Ich würde es vermeiden, aber ansonsten auch INTEGER zuordnen.

Das MySQL BOOLEAN (Alias ​​BOOL, Alias ​​TINYINT (1)) ist nicht mit dem booleschen Typ pg kompatibel. Je nachdem, was sie als boolesche Literale verwenden, können Sie möglicherweise Apps portieren oder nicht. In MySQL werden TRUE und FALSE 1 und 0 ganzzahligen Werten zugeordnet. Es sieht so aus, als ob der Typ pg BOOLEAN die String-Literal-Notation verwendet. Apps können also portabel sein oder auch nicht - zumindest ist es kein Tropfen Ersatz.

Schließlich sollte für die letzte Zeile in Ihrem Tabl die SQLite-Phrase lauten:

INTEGER PRIMARY KEY AUTOINCREMENT

Dies entspricht in etwa

BIGINT PRIMARY KEY AUTO_INCREMENT

in MySQL. In Postgres führt der Datentyp SERIAL zu einer INTEGER-Spalte, die in etwa der von MySQL entspricht

INTEGER PRIMARY KEY AUTO_INCREMENT

Postgres hat auch einen BIGSERIAL-Typ, der mit SERIAL identisch ist, jedoch einen BIGINT-Typ anstelle eines INT-Typs aufweist.

Was ich vermisst habe:

Mir fehlt INTEGER (alias INT) für MySQL. Es ist vergleichbar mit INTEGER in pg. Sehr wichtige Auslassungen: VARCHAR und CHAR. Semantisch sind VARCHAR in MySQL und PG und CHAR in MySQL und PG gleich, aber in MySQL haben diese Typen eine viel kürzere maximale Länge. In MySQL können diese Typen maximal etwas weniger als 64 KB haben, in pg 1 GB (Bytes). Der tatsächliche Längenbezeichner wird in der Anzahl der Zeichen ausgedrückt. Wenn Sie also einen Mehrbyte-Zeichensatz haben, müssen Sie die maximale Länge durch die maximale Anzahl von Zeichen teilen, um die theoretische maximale Länge zu erhalten, die für diesen Zeichensatz angegeben ist. In SQLite ordnen VARCHAR und CHAR beide TEXT zu

Die BIT-Datentypen in MySQL und PG haben ungefähr die gleiche Semantik, aber in MySQL beträgt die maximale Länge des BIT-Datentyps 64 (Bit).

Ich denke, der Datentyp MySQL VARBINARY ist am besten mit dem Datentyp BYTEA von PG vergleichbar. (aber tatsächlich sind auch die BLOB-Typen von MySQL dem zugeordnet)

Der FLOAT-Typ in MySQL sollte REAL in Postgres entsprechen (und REAL auch in SQLite). Der DECIMAL-Typ in MySQL entspricht DECIMAL in Postgres, mit der Ausnahme, dass der Typ in Postgres der Genauigkeit keine willkürliche Begrenzung auferlegt, während in MySQL ist die maximale Genauigkeit (glaube ich) 70. (dh 70 Zahlenpositionen) Sowohl für MySQL als auch für Postgres ist NUMERIC ein Alias ​​für den DECIMAL-Typ.

Roland Bouman
quelle
Es gibt einen weiteren Unterschied: In Pg verwenden Sie varchar () nur, wenn Sie einen vernünftigen Grund haben, die darin enthaltene Einschränkung aufzurufen. In MySQL tun Sie dies, um einen großen, intern inline eingefügten Textblock zu haben, der schnell ausgeführt wird. In Pg läuft es langsamer und nimmt mein Zimmer ein. In Pg würden Sie fast nie varchar () verwenden.
Evan Carroll
5
EvanCarrol, das ist interessant. Also, was sollte man in pg verwenden, um ziemlich kleine Textteile wie Personennamen, Produktnamen, kurze (sagen wir weniger als 255) Beschreibungen zu speichern? nur TEXT?
Roland Bouman
3
Postgres-Boolesche Werte sind keine String-Literal-Typen, sie sehen nur so aus. Wenn Sie sie als Ganzzahl in eine Ganzzahl umwandeln, können Sie sie in eine Boolesche Zahl umwandeln, wenn Sie 0,1 oder NULL Ganzzahlen haben. COPY ... FROM akzeptiert Zahlen, aber INSERT benötigt eine explizite Umwandlung oder Anführungszeichen um die Zahl. '0', cast (0 als Boolen), 'f' und false funktionieren also alle in einer Einfügung, die einen Booleschen Wert erwartet.
user340140