Numeric data type
Numerical data are divided into exact and approximate, integer and real. Bit values are a separate category.
Exact integers
Integers can be declared with the UNSIGNED keyword. In that case the column can no longer hold negative values, and its valid range doubles. So TINYINT accepts values from -128 to 127, while TINYINT UNSIGNED accepts values from 0 to 255.
Exact real numbers
The DECIMAL type stores exact real numbers. It is used when accuracy is critical — for example, when storing financial data.
Usage example:
MySQL 8.1CREATE TABLE Users ( ... salary DECIMAL(5,2) );
This example declares that the salary column stores numbers with a maximum of 5 digits, 2 of which are reserved for the decimal part. So the column holds values in the range from -999.99 to 999.99.
The DECIMAL syntax is equivalent to DECIMAL(M) and DECIMAL(M,0). By default, the M parameter is 10.
The integer part and the fractional part are stored as two separate integers, which makes the memory footprint easy to calculate. For DECIMAL(5,2), the integer part has 3 digits and takes 2 bytes, while the fractional part has 2 digits and needs just 1 byte — 3 bytes in total.
Bit numbers
The BIT(M) type stores a bit sequence of a given length. By default, the length is 8 bits. If the value assigned to such a column uses fewer than M bits, it is padded with zeros on the left. For example, writing b'101' to a BIT(6) column ends up stored as b'000101'.
Approximate numbers
Floating-point numeric types can also take the UNSIGNED attribute. As with integer types, it prevents negative values in the column, but — unlike integer types — the maximum range of column values stays the same.
Integer numbers
Auto-increment types
The SERIAL types are pseudo-types for creating auto-incrementing columns. SERIAL is equivalent to INTEGER with an automatically created sequence.
Exact real numbers
The NUMERIC type stores exact real numbers. It is used when accuracy is critical — for example, when storing financial data.
Usage example:
MySQL 8.1CREATE TABLE Users ( ... salary NUMERIC(10,2) );
This example declares that the salary column stores numbers with a maximum of 10 digits, 2 of which are reserved for the decimal part. So the column holds values in the range from -99999999.99 to 99999999.99.
Approximate numbers
Floating point types are used for approximate calculations. PostgreSQL also supports special values: Infinity, -Infinity and NaN (not a number).