Подключение

#MySQL

mysql -h 127.0.0.1 -u root -p

#PostgreSQL

psql -h 127.0.0.1 -U postgres

Типы данных

#MySQL

TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT
FLOAT, DOUBLE, DECIMAL
CHAR, VARCHAR
TINYTEXT, TEXT, MEDIUMTEXT, LONGTEXT
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB
DATE, DATETIME, TIMESTAMP, TIME, YEAR
JSON
ENUM, SET

#PostgreSQL

  • В PostgreSQL нет TINYINT и MEDIUMINT, и нет unsigned-типов.
  • В отличие от MySQL, в PostgreSQL TEXT ≈ VARCHAR без лимита и без performance-разницы.
  • В PostgreSQL нет BLOB-типов как в MySQL (BYTEA хранит бинарные данные напрямую).
  • В PostgreSQL нет типа YEAR. TIMESTAMP не имеет проблемы 2038 года.
SMALLINT, INTEGER, BIGINT
REAL, DOUBLE PRECISION, NUMERIC
CHAR, VARCHAR, TEXT
BYTEA
DATE, TIME, TIMESTAMP, TIMESTAMPTZ, INTERVAL
BOOLEAN
JSON, JSONB, XML
UUID
ENUM, ARRAY
  • MySQL: проще, меньше типов, слабее контроль
  • PostgreSQL: строгая типизация, больше типов

Знаковые и беззнаковые целые

1 байт имеет 256 (28) возможных значений. В знаковом представлении эти значения могут находиться в диапазоне от -128 до +127, а в беззнаковом: от 0 до 255.

Если мы знаем, что значение не может (или не должно) быть отрицательным и нам необходимо сохранить, например, значение 200, что невозможно в знаковом представлении одного байта, мы можем использовать беззнаковое представление. В противном случае, если нам необходимо хранить отрицательные значения и значения больше 127, придётся увеличить размер до 2 байт.

#MySQL

По умолчанию целые типы (TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT) являются знаковыми (SIGNED) и могут хранить отрицательные значения.

Можно указать UNSIGNED, чтобы убрать отрицательную часть диапазона и увеличить максимальное положительное значение примерно в 2 раза.

INT
INT UNSIGNED

Например:

INT -2 147 483 648 ... 2 147 483 647
INT UNSIGNED 0 ... 4 294 967 295

#PostgreSQL

Все стандартные целочисленные типы (SMALLINT, INTEGER, BIGINT) знаковые.

UNSIGNED в PostgreSQL отсутствует.

INTEGER имеет диапазон: -2 147 483 648 ... 2 147 483 647

Если нужен только положительный диапазон, обычно используют CHECK:

age INTEGER CHECK (age >= 0)

Регистрозависимость

#MySQL

Имена столбцов по умолчанию нечувствительны к регистру - столбцы Name и NAME считаются одинаковыми. Имена столбцов, содержащие пробелы или совпадающие с ключевыми словами, заключаются в обратные кавычки (`), например: `User name`.

#PostgreSQL

Регистрозависимость действует с оговорками. Если имя столбца указано без двойных кавычек, то Name и NAME считаются одним и тем же именем, так как PostgreSQL автоматически приводит такие идентификаторы к нижнему регистру. Если же имя указано в двойных кавычках, то "Name" и "NAME" считаются разными столбцами. Для составных имён и имён, совпадающих с ключевыми словами, также используются двойные кавычки, например: "User name".


Ограничения (Constraints)

#MySQL

Ограничения используются для обеспечения целостности данных и могут задаваться как на уровне столбцов, так и на уровне таблиц. Поддерживаются основные типы ограничений: PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK (полноценно - начиная с MySQL 8.0.16) и NOT NULL; при этом имена ограничений не обязательны и часто генерируются автоматически.

#PostgreSQL

Ограничения являются полноценной частью модели данных и строго контролируются системой. Поддерживаются все основные типы ограничений (PRIMARY KEY, UNIQUE, FOREIGN KEY, CHECK, NOT NULL), при этом ограничениям рекомендуется явно задавать имена, так как они активно используются в сообщениях об ошибках и при дальнейшем сопровождении схемы.


Source: Orkhan Alishov's notes