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
CREATE TABLE
Definitionen zwischen diesen drei Typen erheblich zu vereinfachen . Da sie häufig verwendet werden, muss Open Source-Code für jeden von ihnen bereit sein.Antworten:
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:
Dies entspricht in etwa
in MySQL. In Postgres führt der Datentyp SERIAL zu einer INTEGER-Spalte, die in etwa der von MySQL entspricht
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.
quelle