Сравнение типов столбцов базы данных в MySQL, PostgreSQL и SQLite? (Кросс-карт) - PullRequest
62 голосов
/ 21 декабря 2009

Я пытаюсь найти способ связать типы столбцов в наиболее часто используемых базах данных: 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

1 Ответ

15 голосов
/ 22 декабря 2009

Список вещей, которые я бы сделал по-другому:

MEDIUMINT в MySQL - странная утка (3 байта). Я бы избегал этого, но в противном случае сопоставил бы его с INTEGER.

MySQL BOOLEAN (псевдоним BOOL, псевдоним TINYINT (1)) не совместим с логическим типом pg. Вы можете или не сможете портировать приложения в зависимости от того, что они используют в качестве логических литералов. В MySQL значения TRUE и FALSE соответствуют 1 и 0 целочисленным значениям. Похоже, что тип pg BOOLEAN использует строковые литеральные обозначения. Так что приложения могут быть или не быть портативными - по крайней мере, это не падение замены.

Наконец, для последней строки в вашей таблице я думаю, что фраза 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 в pg. Очень важные упущения: VARCHAR и CHAR. Семантически VARCHAR в MySQL и PG и CHAR в MySQL и PG одинаковы, но в MySQL эти типы имеют гораздо более короткую максимальную длину. В MySQL эти типы могут иметь максимум чуть менее 64 КБ, в pg 1 ГБ (байт). Фактический спецификатор длины выражается в количестве символов, поэтому, если у вас есть многобайтовый набор символов, вы должны разделить максимальную длину на максимальное количество символов, чтобы получить теоретическую максимальную длину, указанную для этого набора символов. В SQLite VARCHAR и CHAR сопоставляются как TEXT

Типы данных BIT в MySQL и PG имеют примерно одинаковую семантику, но в MySQL максимальная длина типа данных BIT составляет 64 (бит)

Я думаю, что тип данных MySQL VARBINARY лучше всего сопоставим с типом данных PG BYTEA. (но на самом деле типы BLOB в MySQL также соответствуют этому)

Тип FLOAT в MySQL должен быть эквивалентен REAL в postgres (и REAL в SQLite тоже) Тип DECIMAL в MySQL эквивалентен DECIMAL в postgres, за исключением того, что в postgres тип не накладывает ограничение точности arbtrary на точность, тогда как в MySQL максимальная точность равна (я полагаю) 70. (то есть 70 числовых позиций) И для MySQL, и для Postgres NUMERIC - это псевдоним типа DECIMAL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...