C, PHP, VB, .NET

Дневникът на Филип Петров


* Типове данни в MySQL

Публикувано на 01 февруари 2009 в раздел Бази от Данни.

Въпреки, че SQL би трябвало да е унифициран език, всяка система за управление на бази от данни се различава от другите. Много рядко се спазва истинския ANSI стандарт на SQL и често има съществени различия.

За целта на упражнения по бази от данни би трябвало да се фокусираме предимно върху стандарта. Въпреки това избрахме MySQL, тъй като тази система за управление на бази данни е изключително широко разпространена и е безплатна. Така ще бъде възможно примерите да се прилагат директно в работна среда.

Нека разгледаме типовете данни по категории:

1. Цели числа:

a) TINYINT – цяло число в интервала [-128, 127]. Ако се добави параметър unsigned става от [0, 255].

б) SMALLINT – цяло число в интервала [-32768, 32767] или [0, 65535] като unsigned.

в) MEDIUMINT – цяло число в интервала [-8388608, 8388607] или [0, 16777215] като unsigned.

г) INT – цяло число в интервала [-2147483648, 2147483647] или [0, 4294967295] като unsigned.

д) BIGINT – цяло число в интервала [-9223372036854775808, 9223372036854775807] или [0, 18446744073709551615] като unsigned.

е) BIT – приема две стойности – 0 или 1 – ако не се зададе length или „N“ на брой бита, ако се зададе length=N. Максимума е 64 бита.

ж) BOOL, BOOLEAN – синоними на TINYINT(1). Работи със стойности 0 (false) или която и да е друга цифра (true).

з) INTEGER – синоним на INT.

и) SERIAL – синоним на BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.

2. Числа с плаваща запетая:

a) FLOAT(length, dec) – стандартно число с плаваща запетая. Параметърът length ограничава броя на цифрите общо, а dec ограничава броя на цифрите след десетичната запетая.

б) DOUBLE(length, dec) – същото като FLOAT, но с двойна точност. Максималната стойност на length е 255.

в) DECIMAL(length, dec) – числото е записано по такъв начин, че различните системи ще прочетат числото с неговата оригинална точност (нещо, което не е вярно за double, където винаги приемаме, че при четене е възможна „загуба“ поради различна прецизност на закръгляване). За сметка на това предимство, работата с decimal е по-бавна отколкото с double. Максималната стойност на length е 65.

г) NUMERAL(length, dec), DEC(length,dec), FIXED(length,dec) – синоними на DECIMAL.

3. Текстови типове:

а) CHAR(length) – Съхранява символи с фиксирана дължина. Параметърът length може да бъде от 1 до 255 (по подразбиране 1), което представлява броят символи от въпросната кодировка. Дори да не използвате целия капацитет на полето, то винаги заема максималната си дължина памет.

б) VARCHAR(length) – Символни низове с променлива дължина. Параметърът length указва максималния брой символи, а реално се заема точно толкова памет, колкото символа се използват. Теоретично може да е от 1 до 65535 символа, но практически е ограничен от максималната дължина на ред в MySQL (общият сбор байтове, които заемат всички колони), която е 65535 байта! Във версии на MySQL, които са по-стари от 5.0.3, може да се съхраняват не повече от 255 символа.

в) TINYTEXT – може да съхранява до 255 символа. TEXT полетата работят както VARCHAR, но за разлика от него самите данни се съхраняват като обекти извън самата таблица, а в таблицата се пазят само референции към тях. По принцип се смята, че работата с полета от тип TEXT е по-бавна. За сметка на това „облекчават“ самата таблица откъм обем и работата с други данни от нея става много по-бърза. Също така те използват малко по-малко памет, но създават риск от фрагментация.

г) TEXT – 65535 символа.

д) MEDIUMTEXT – 16777215 символа.

е) LONGTEXT – 4294967295 символа.

ж) BINARY(bytes) – поле подобно на CHAR, но с тази разлика, че в него текстовите низове се записват като бинарна поредица и нямат кодировка. Това практически означава, че в последствие сравнението между такива низове ще се извършва байт по байт вместо символ по символ. Незаетите символи се запълват с 0x00 (нулевия байт). С BINARY обикновено се работи доста по-бързо, отколкото с CHAR. Недостатък в този тип данни се явява липсата на collation (правила за сравнение на низове). Поради тази причина е препоръчително да използвате този тип данни само за бинарна информация или текст, който ще използвате само за четене без сортиране.

з) VARBINARY(bytes) – аналогично по действие с VARCHAR, но също както BINARY работи с поредица от байтове и сравненията между записани текстови низове ще се правят байт по байт, а не символ по символ. И по същия начин работата с VARBINARY е по-бърза, отколкото с VARCHAR, но липсата на collation го прави неподходящ при сложни сравнения между низове.

и) TINYBLOB – Същото като TINYTEXT, но съхранява 255 байта, а не символи.

й) BLOB – Същото като TEXT, но съхранява байтове, а не символи.

к) MEDIUMBLOB – Същото като MEDIUMTEXT, но съхранява байтове, а не символи.

л) LONGBLOB – Същото като LONGTEXT, но съхранява байтове, а не символи.

4. Типове за дата и време:

а) DATE – Дата във формат YYYY-MM-DD. Минималната стойност е ‘1000-01-01’, а максималната ‘9999-12-31’.

б) DATETIME – Дата и време във формат YYYY-MM-DD HH:MM:SS. Минималната стойност е ‘1000-01-01 00:00:00’, а максималната ‘9999-12-31 23:59:59’.

в) TIMESTAMP – Дата и време във формат YYYYMMDDHHMMSS. Отговаря на „Unix епохата“, т.е. започва от ‘1970-01-01 00:00:01’ UTC и завършва максимално в ‘2038-01-19 03:14:07’.

г) TIME – Време във формат HH:MM:SS.

д) YEAR(length) – Стойността на length може да е 2 или 4, като по подразбиране е 4. Ако е 4, то това поле представлява година от ‘1901’ до ‘2155’ или стойността ‘0000’ (години извън интервала ще се приемат автоматично за нулевата стойност). Ако length е 2, то възможните стойности са от „70 до 69“ – числата от 70 до 99 представляват годините от 1970 до 1999, а числата от 0 до 69 представляват годините от 2000 до 2069. Имайте предвид, че от версия 5.5.27 нататък формат YEAR(2) е „deprecated“, т.е. в бъдещи версии няма да го има.

5. Други типове данни:

а) ENUM(„o1″,“o2“, …) – Изброим тип данни. Записва се само една стойност от изброените. Може да има максимум 65535 различни стойности.

б) SET(„o1″,“o2“, …) – Също като enum е изброим тип данни, но позволява да се записват повече от една стойност в клетка на таблица (това всъщност е единствения тип данни, които позволява това). Може да съдържа максимум 64 елемента.

 



8 коментара


  1. Mertol каза:

    Мисля, че DECIMAL не е стринг – т.е. по 8 бита на символ, ами си е инт със запетая.

  2. Иван каза:

    Има грешка:
    В „При всички целочислени типове параметъра length е незадължителен.“ „параметър“ трябва да е с пълен член :P

  3. Така е. Поправено…

  4. Статията е обновена. Отразени са редица неточности, както и са добавени поправки така, че да важи за по-новите версии на MySQL.

  5. KiMusubi каза:

    Споредицата ти за Бази Данни е страхотна и много полезна, и не само тя. Чест ти прави… Бъди здрав и продължавай да споделя знанието си!

    Със здраве!

  6. Веселин каза:

    Като пусна процедура на DECIMAL променливи ми закръгля (както е в примера) 211,98 и 212,20 показва 1-ца, а при DOUBLE между 211,98 и 212 дава 0. Не трябва ли да е обратното по логиката за DECIMAL?

  7. Веселин – кой пример и каква процедура? Може би примерен код ще бъде полезен.

    Важно е как си дефинирал типа. Например DECIMAL(4,2) и DECIMAL (4,1) са различни типове, пък било то и равен общ брой цифри.

Добави коментар

Адресът на електронната поща няма да се публикува


*