Изборът на правилния тип данни за колона на таблицата е важно решение. Намалява необходимостта от преобразуване на типове данни, подобрява производителността на заявките към база данни и свежда до минимум изискванията за съхранение.
В това ръководство разглеждате различните типове данни, които се използват в системите за управление на релационни бази данни (RDBMS). Тези типове данни могат да се използват при създаване или промяна на таблица или при деклариране на променливи в съхранени процедури на база данни. Някои добре познати RDBMS са MySQL и PostgreSQL.
Типове двоични данни на SQL
За съхраняване на двоични данни (0
или 1
), използвате BINARY
и VARBINARY
типове данни. BINARY
типът данни съхранява двоични данни с фиксирана дължина, докато VARBINARY
съхранява двоични данни с променлива дължина. И двата типа данни се използват за съхраняване на низове от битове (0
и 1
'с). Техните стойности се присвояват и извличат с помощта на шестнадесетично представяне, което се обозначава с префикс 0x
. Колоните (или променливите) и на двата Binary
и VarBinary
типовете данни се използват за съхраняване на съдържанието на файлове с изображения като JPEG, BMP, файлове с документи и т.н.
Например за десетична стойност от 63
, неговата шестнадесетична стойност е представена с 0x3F
и неговият еквивалент на двоичен битов низ е 111111
. За да разберете стойността на тези двоични низове и как се съхраняват, разгледайте примера по-долу:
Забележка Освен ако не е посочено друго, всички демонстрирани в това ръководство команди на базата данни работят добре и на MySQL и PostgreSQL .
-
От командния ред създайте таблица, наречена
BinaryExample
както е показано по-долу:CREATE TABLE BinaryExample ( BinaryCol BINARY (10), VarBinaryCol VARBINARY (10) );
-
Вмъкнете ред в
BinaryExample
таблица:INSERT INTO BinaryExample (BinaryCol, VarBinaryCol) VALUES (0x4D7953514C, 0x39274D);
-
Изберете данните от
BinaryExample
таблица:SELECT BinaryCol, VarBinaryCol FROM BinaryExample;
Резултатът изглежда по следния начин:
+------------------------+----------------------------+ | BinaryCol | VarBinaryCol | +------------------------+----------------------------+ | 0x4D7953514C0000000000 | 0x39274D | +------------------------+----------------------------+
Както можете да видите, BinaryCol
данните се допълват до максималния размер на колоната с крайни нули, но VarBinaryCol
колоната с данни не е. Това е така, защото колоните на VarBinaryCol
се дефинират като променлива дължина.
Забележка Максималният размер (дължина) на типовете данни Binary и VarBinary варира в зависимост от реализацията на базата данни. Те обикновено са доста големи (над 8000 байта). Някои реализации на база данни имат двоични разширения към тези основни типове данни, които могат да съхраняват данни в размери от няколко гигабайта.
Числови типове данни на SQL
Наличните типове числови данни могат да бъдат разделени на следните групи:целочислени типове числови данни, точни числови типове данни и приблизителни числови типове данни. Разделите по-долу обсъждат всяка група.
Целочислени типове числови данни
Целочислените типове данни могат да бъдат Unsigned и Signed. Неподписан може да съхранява само нула и положителни числа, докато Подписан позволява нула, положителни и отрицателни числа.
Повечето реализации на SQL поддържат целочислени типове данни INT
, SMALLINT
и TINYINT
за съхранение на положителни и отрицателни цели числа. Избраният от вас целочислен числов тип данни зависи от диапазона от стойности, които трябва да съхраните.
Следващата таблица показва разрешеното съхранение в байтове за целочислените числови типове данни и техните минимални и максимални стойности SIGNED.
Тип | Съхранение (байтове) | Минимална стойност ПОДПИСАНО | Максимална стойност SIGNED |
---|---|---|---|
INT | 4 | минус 2^31 (-2147483648) | плюс 2^31 (2147483647) |
SMALLINT | 2 | минус 2^15 (-32768) | плюс 2^15 (32767) |
TINYINT | 1 | -128 | 127 |
Примерът по-долу демонстрира минималните и максималните стойности със знак за целите числови типове данни с помощта на таблица с име NumericExample
.
-
От командния ред създайте
NumericExample
таблица.CREATE TABLE NumericExample ( IntColumn INT, SmallIntColumn SMALLINT, TinyIntColumn TINYINT );
-
Вмъкнете следните стойности в
NumericExample
таблица.INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (3258594758, 32767, 255);
Когато изпълните горната команда, получавате
Out of range
грешка, както е показано в изхода по-долу. Не можете да вмъкнете стойностите3258594758
и255
къмIntColumn
иTinyIntColumn
съответно. Това е така, защото максималната SIGNED стойност за целочислен тип данни е2147483647
а този на TinyInt е127
.ERROR 1264 (22003): Out of range value for column 'IntColumn' at row 1
-
Актуализирайте стойностите на
IntColumn
иTinyIntColumn
колони и изпълнете отновоINSERT
команда.INSERT INTO NumericExample (IntColumn, SmallIntColumn, TinyIntColumn) VALUES (2147483647, 32767, 127);
-
Извлечете стойностите на колоните с помощта на
SELECT
изявление:SELECT IntColumn, SmallIntColumn, TinyIntColumn FROM NumericExample;
Резултатът прилича на примера по-долу:
+------------+----------------+---------------+ | IntColumn | SmallIntColumn | TinyIntColumn | +------------+----------------+---------------+ | 2147483647 | 32767 | 127 | +------------+----------------+---------------+
Десични числови типове данни (точно числови)
Десетичните типове данни, DECIMAL
и NUMERIC
, съхраняват точни и фиксирани числови стойности. Тези типове данни са известни още като точно число типове данни. Те съхраняват целочислена стойност вляво от десетичната запетая и дробна стойност вдясно от десетичната запетая. Те са функционално еквивалентни със същите изисквания за съхранение. Съхранението, използвано за тези типове, зависи от определената прецизност и диапазони. Те могат да варират от 2 байта до 17 байта, а стойностите им могат да варират от -10^38 +1
до +10^38 -1
.
Тези два типа данни се дефинират с прецизност и скала . Точността обозначава броя на местата вляво и вдясно от десетичната запетая, комбинирани, докато скалата обозначава общия брой цифри вдясно от десетичната запетая. Тези два типа данни се създават с помощта на следния синтаксис:
DECIMAL(precision, scale)
или
NUMERIC(precision,scale)
Примерът по-долу показва как да създадете и използвате десетичния числов тип данни.
-
От командния ред създайте
ExactNumericExample
таблица.CREATE TABLE ExactNumericExample ( DecimalCol DECIMAL(5,2), NumericCol NUMERIC(7,2) );
-
Вмъкнете следните стойности в
ExactNumericExample
таблица.INSERT INTO ExactNumericExample (DecimalCol, NumericCol) VALUES (123.45, 12345.67);
-
Извлечете стойностите на колоните с помощта на
SELECT
изявление:SELECT DecimalCol, NumericCol FROM ExactNumericExample;
Резултатът прилича на следното:
+------------+------------+ | DecimalCol | NumericCol | +------------+------------+ | 123.45 | 12345.67 | +------------+------------+
Числови типове данни с плаваща запетая (приблизителни числови)
Типовете числови данни с плаваща запетая са FLOAT
и REAL
. Наричат се още приблизителни числови типове данни. Тези типове данни съхраняват приблизителна стойност поради двоичното представяне на данните с плаваща запетая. Синтаксисът за създаване на колона или променлива с плаваща запетая е следният:
Float(N)
Параметърът N
показва дали полето трябва да съдържа четири или осем байта. Стойност N
повече от седем изисква осем байта; седем или по-малко изисква четири байта. Плаващата точност за този тип данни варира от -1.79E + 308
до 1.79E + 308
.
По същия начин колона и променлива, дефинирани като тип данни REAL
заема четири байта място за съхранение и предоставя диапазон от стойности от -3.40E + 38
до 3.40E + 38
.
Типове данни за символи в SQL
Типовете данни CHAR
и VARCHAR
се използват за съхраняване на символни данни с дължина до 8000 байта. И двата типа данни съхраняват низови стойности в колоните на базата данни, но се различават по начина, по който техните стойности се съхраняват и извличат. Дължината на CHAR
типът данни остава фиксиран с определената си дължина, независимо дали това пространство за разпределение се използва или не. Ако пространството не се използва, колоната или променливата се допълват с допълнителни интервали. VARCHAR
извежда стойността такава, каквато е, без допълнителни интервали.
Примерът по-долу демонстрира типа данни за символи.
-
От командния ред създайте
Employee
таблица.CREATE TABLE Employee ( LastName VARCHAR(25), FirstName VARCHAR(20), Sex CHAR(1) );
-
Вмъкнете следните стойности в
Employee
таблица.INSERT INTO Employee (LastName, FirstName, Sex) VALUES ('Jones', 'Mary', 'F');
-
Извлечете стойностите на колоните с помощта на
SELECT
изявление:SELECT LastName, FirstName, Sex FROM Employee;
Резултатът би искал следното:
+----------+-----------+------+ | LastName | FirstName | Sex | +----------+-----------+------+ | Jones | Mary | F | +----------+-----------+------+
Колоните LastName
и Firstname
са декларирани тип Varchar
. Това позволява имената да бъдат толкова дълги, колкото дефиницията на типа данни. Но за имена, по-къси от посочения максимум, не се добавят празни интервали към данните в тези колони.
Тип данни за дата и час в SQL
DATETIME
типът данни се използва за съхраняване на стойностите за дата и час в базата данни. Стойности за DATETIME
типът данни използва четири байта съхранение за частта с дата и четири байта за частта с времето. Времевата част от този тип данни определя времето с детайлност до броя милисекунди след полунощ. Прецизността за този тип данни варира от „1 януари 1753 г.“ до „31 декември 9999 г.“ с точност от 3,33 милисекунди.
Забележка Ако присвоите само стойността на датата на DATETIME
колона или променлива тип данни, частта от времето е по подразбиране полунощ.
Примерът по-долу демонстрира DATETIME
тип данни.
DELIMITER //
CREATE PROCEDURE Datetimedemo()
BEGIN
DECLARE BirthDate DATETIME
SET BirthDate = '1990-01-01 09:00:00'
SELECT BirthDate
END//
DELIMITER ;
call Datetimedemo;
Резултатът прилича на следното:
+----------+-----------+
| BirthDate |
+----------+-----------+
| 1990-01-01 09:00:00 |
+----------+-----------+
Забележка Някои реализации на SQL поддържат допълнителни типове данни, които са или подмножество, супернабор или вариант на всички посочени по-горе типове данни.
Съображения за типа данни на SQL
Когато проектирате база данни, е изключително важно внимателно да изберете подходящи типове данни за колоните на таблицата и променливите на съхранените процедури.
Направеният избор може да окаже значително влияние върху ефективността на съхранението и цялостната производителност на базата данни. Прост пример е да дефинирате Age
на човек колоната да бъде от Tinyint
тип данни, за разлика от Int
тип данни. Това се дължи на следните причини:
- Както беше отбелязано по-рано,
Tinyint
типовете данни имат ¼ от изискванията за съхранение наInt
типове данни. - Ефективността на извличане на
Tinyint
колона спрямоInt
колоната е много по-голяма.
На пръв поглед това може да не е от голямо безпокойство. Но ако засегнатата таблица има милиони редове в нея, със сигурност може да се постигне както ефективността на съхранението, така и ефективността на производителността. Ако разширите тези критерии за проектиране в цяла база данни, можете да генерирате тази ефективност на порядък.
Прекарването на необходимото време за проектиране при избор на тип данни в базата данни може потенциално да смекчи необходимостта от извършване на скъпи преобразувания на типове в заявки и логика на съхранени процедури, когато се сравняват колони от различни типове данни.
Например, в една таблица съхранявате дата в Varchar(20)
колона, а в друга таблица съхранявате дата в Datetime
колона. Ако трябва да сравните двете колони, трябва да използвате функция за преобразуване на тип данни в заявка към една от двете колони. Това е скъпа операция.
Заключение
Типовете данни на SQL са атрибутите, свързани с колоните и променливите на базата данни. Тези атрибути могат да бъдат под формата на двоични, числови, символни и дата/час. Необходимо е внимателно време за проектиране, за да се гарантира, че колоните и променливите са дефинирани с правилен тип данни, за да се гарантира ефективност както на съхранение, така и на изпълнение на заявка.