Comparación de tipos de columna de base de datos en MySQL, PostgreSQL y SQLite?(Cross-Mapping)
database types (1)
Estoy tratando de encontrar una forma de relacionar los tipos de columnas en las Bases de datos más utilizadas: MySQL , PostgreSQL y SQLite .
Esto es lo que tengo hasta ahora, pero me temo que no está hecho y necesito algunas personas con más experiencia para ayudarme a terminar cualquier tipo que falte.
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
Lista de cosas que haría de manera diferente:
MEDIUMINT en MySQL es un pato impar (3 bytes). Yo lo evitaría, pero de lo contrario lo mapearía en INTEGER también.
MySQL BOOLEAN (alias BOOL, alias TINYINT (1)) no es compatible con el tipo pg booleano. Puede o no ser capaz de portar aplicaciones según lo que usen como literales booleanos. En MySQL, los mapas TRUE y FALSE son valores enteros 1 y 0. Parece que el tipo pg BOOLEAN usa una notación literal de cadena. Por lo tanto, las aplicaciones pueden ser portátiles o no, al menos no son reemplazos.
Finalmente, para la última línea en su tabla, creo que la frase SQLite debe leer:
INTEGER PRIMARY KEY AUTOINCREMENT
Esto es más o menos equivalente a
BIGINT PRIMARY KEY AUTO_INCREMENT
en MySQL En postgres, el tipo de datos SERIAL resulta en una columna INTEGER, y esto será casi lo mismo que MySQL
INTEGER PRIMARY KEY AUTO_INCREMENT
Postgres también tiene un tipo BIGSERIAL, que es lo mismo que SERIAL pero con un tipo BIGINT en lugar de un tipo INT.
Lo que me faltaba:
Me falta INTEGER (alias INT) para MySQL. Es comparable a INTEGER en la pág. Omisiones muy importantes: VARCHAR y CHAR. Semánticamente, VARCHAR en MySQL y PG, y CHAR en MySQL y PG son los mismos, pero en MySQL estos tipos tienen una longitud máxima mucho más corta. En MySQL estos tipos pueden tener un máximo de un poco menos de 64 kb, en pg 1Gb (bytes). El especificador de longitud real se expresa en el número de caracteres, por lo que si tiene un conjunto de caracteres de múltiples bytes, debe dividir la longitud máxima por el número máximo de caracteres para obtener la longitud máxima teórica especificada para ese conjunto de caracteres. En SQLite, VARCHAR y CHAR asignan ambos a TEXT
Los tipos de datos BIT en MySQL y PG tienen aproximadamente la misma semántica, pero en MySQL, la longitud máxima del tipo de datos BIT es 64 (bits)
Creo que el tipo de datos VARBINARIO de MySQL se puede comparar mejor con el tipo de datos BYTEA de PG. (pero, de hecho, los tipos BLOB de MySQL también se asignan a eso)
El tipo FLOAT en MySQL debería ser equivalente a REAL en postgres (y REAL en SQLite también). El tipo DECIMAL en MySQL es equivalente a DECIMAL en postgres, excepto que en postgres, el tipo no impone un límite arbtrary a la precisión, mientras que en MySQL la precisión máxima es (creo) 70. (es decir, 70 posiciones de números) Para MySQL y Postgres, NUMERIC es un alias para el tipo DECIMAL.