Я пытаюсь найти способ связывать типы столбцов через наиболее используемые базы данных: MySQL, PostgreSQL и SQLite.
Вот что я до сих пор, но я боюсь, что это не сделано, и мне нужны люди с большим опытом, чтобы помочь мне закончить любые отсутствующие типы.
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
Список вещей, которые я бы сделал по-другому:
MEDIUMINT в MySQL - нечетная утка (3 байта). Я бы избегал этого, но в противном случае также сопоставлял его с INTEGER.
MySQL BOOLEAN (псевдоним BOOL, псевдоним TINYINT (1)) несовместим с типом pg boolean. Вы можете или не сможете переносить приложения в зависимости от того, что они используют в качестве логических литералов. В MySQL, TRUE и FALSE отображают 1 и 0 целых значений. Похоже, что тип pg BOOLEAN использует строковое литерала. Таким образом, приложения могут быть или не быть переносимыми - по крайней мере, это не замена.
Наконец, для последней строки в вашем tabl я думаю, что фраза SQLite должна читать:
INTEGER PRIMARY KEY AUTOINCREMENT
Это примерно эквивалентно
BIGINT PRIMARY KEY AUTO_INCREMENT
в MySQL. В postgres тип данных SERIAL приводит к столбцу INTEGER, и это будет примерно так же, как MySQL
INTEGER PRIMARY KEY AUTO_INCREMENT
Postgres также имеет тип BIGSERIAL, который является таким же, как SERIAL, но с типом BIGINT вместо типа INT.
Что я пропустил:
Мне не хватает INTEGER (псевдоним INT) для MySQL. Это сопоставимо с INTEGER на стр. Очень важные упущения: VARCHAR и CHAR. Семантически, VARCHAR в MySQL и PG и CHAR в MySQL и PG те же, но в MySQL эти типы имеют гораздо меньшую максимальную длину. В MySQL эти типы могут иметь максимум немного меньше, чем 64kb, в pg 1Gb (байты). Фактический спецификатор длины выражается в количестве символов, поэтому, если у вас есть многобайтовый набор символов, вы должны разделить максимальную длину на максимальное количество символов, чтобы получить теоретическую максимальную длину, указанную для этого набора символов. В SQLite, VARCHAR и CHAR отобразите оба значения в TEXT
Типы данных BIT в MySQL и PG имеют примерно одну и ту же семантику, но в MySQL максимальная длина типа данных BIT равна 64 (бит)
Я думаю, что тип данных MySQL VARBINARY лучше всего сопоставляется с типом данных PG BYTEA. (но на самом деле MySQL BLOB-типы также сопоставляются с этим)
Тип FLOAT в MySQL должен быть эквивалентен REAL в postgres (и REAL в SQLite тоже) Тип DECIMAL в MySQL эквивалентен DECIMAL в postgres, за исключением того, что в postgres тип не налагает произвольный предел точности, тогда как в MySQL максимальная точность (я считаю) 70. (то есть 70 позиций позиций) Для MySQL и Postgres NUMERIC является псевдонимом для типа DECIMAL.