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

46

Я пытаюсь найти способ связывать типы столбцов через наиболее используемые базы данных: 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
  • 0
    Я бы сказал, и я думаю, что это правда, перекрестное сопоставление типов баз данных не рекомендуется, потому что (на мой взгляд) абсолютно нет времени для перекрестного сопоставления. Может случиться так, что вам придется конвертировать PG в My, но не для их перекрестного сопоставления.
  • 1
    Почему бы не добавить SQL Server & Oracle в таблицу?
Показать ещё 3 комментария
Теги:
database
types

1 ответ

11
Лучший ответ

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

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.

  • 0
    есть и другое отличие: в Pg varchar () используется только тогда, когда у вас есть разумная причина для вызова ограничения, которое он предоставляет. В MySQL вы делаете это, чтобы иметь большой внутренний текстовый блок, который работает быстро. В Pg он работает медленнее и занимает мою комнату. В Pg вы почти никогда не используете varchar ().
  • 4
    ЭванКаррол, это интересно. Так что же нужно использовать в pg для хранения довольно маленьких фрагментов текста, таких как имена людей, названия продуктов, короткие (скажем, менее 255) описания? просто текст?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню