Подключение
#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
SMALLINT, INTEGER, BIGINT REAL, DOUBLE PRECISION, NUMERIC CHAR, VARCHAR, TEXT BYTEA DATE, TIME, TIMESTAMP, TIMESTAMPTZ, INTERVAL BOOLEAN JSON, JSONB, XML UUID ENUM, ARRAY
Знаковые и беззнаковые целые
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