Числовые типы
Хранение целых чисел
- TINYINT(N) (синоним INTEGER, BOOL, BOOLEAN) — 8 бит;
- SMALLINT(N) — 16 бит;
- MEDIUMINT(N) — 24 бита;
- INT(N) — 32 бита;
- BIGINT(N) — 64 бита.
СУБД MySQL позволяет указывать для целых чисел «размер», например INT(11). Для большинства приложений это не имеет значения: диапазон возможных значений этим не ограничивается. Однако данный параметр говорит некоторым интерактивным инструментам MySQL, сколько позиций необходимо зарезервировать для вывода числа. С точки зрения хранения и вычисления INT(1) и INT(20) идентичны.
Целочисленный тип данных длиной N бит позволяет хранить значения от -2(N-1) до 2(N-1)-1.
Целые типы данных могут иметь необязательный атрибут UNSIGNED, запрещающий отрицательные значения и приблизительно вдвое увеличивающий верхний предел положительных значений. Например, тип TINYINT UNSIGNED позволяет хранить значения от 0 до 255, а не от -128 до 127.
Знаковые и беззнаковые типы требуют одинакового пространства и обладают одинаковой производительностью.
Необязательный атрибут ZEROFILL заполнит нулями свободные позиции слева. Например с TINYINT(3) ZEROFILL, величина 2 будет записана, как 002.
Тип данных | Бит | По умолчанию | UNSIGNED |
---|---|---|---|
TINYINT | 8 | -128 — 127 | 0 — 255 |
SMALLINT | 16 | -32768 — 32767 | 0 — 65535 |
MEDIUMINT | 24 | -8388608 — 8388607 | 0 — 16777215 |
INT | 32 | -2147483648 — 2147483647 | 0 — 4294967295 |
BIGINT | 64 | -9223372036854775808 — 9223372036854775807 | 0 — 18446744073709551615 |
Хранение дробных чисел
Все типы допускают приближенные математические вычисления с плавающей точкой, но в случае с FLOAT и DOUBLE операции выполняются быстрее, так как процессор выполняет их естественным для него образом.
- FLOAT(M,D) — число с плавающей точкой небольшой точности, задействует 4 байта.
- DOUBLE(M,D) (синонимы REAL, DOUBLE PRECISION) — число с плавающей точкой двойной точности. Задействует 8 байт, имеет большую точность и больший диапазон значений.
- DECIMAL(M,D) (синонимы DEC, NUMERIC, FIXED) — дробное число, хранящееся в виде строки, если десятичное значение равно 0, значение не будет иметь десятичной запятой или дробной части. Предназначен для хранения точных дробных чисел (можно хранить большие целые числа, не помещающиеся в типе BIGINT). Имеет смысл использовать только тогда, когда нужны точные результаты при вычислениях с дробными числами, — например, при хранении финансовых данных. Задействует больше пространства.
M — количество отводимых под число символов. D — количество символов дробной части.
Для типов с плавающей точкой можно указать максимально разрешенное количество цифр до и после десятичной запятой. В случае с DECIMAL это влияет на объем пространства, требуемого для хранения данных столбца. При указании точности, в некоторых случаях, MySQL незаметно для пользователя может выбирать другой тип данных или будет округлять значения при сохранении. Поэтому рекомендуют указывать желаемый тип, но не точность.
FLOAT и DOUBLE могут иметь параметр UNSIGNED, запрещающий отрицательные числа, но диапазон значений от этого не изменится.
Число типа DECIMAL в MySQL 5.0 и более новых версиях может содержать до 65 цифр. В более ранних версиях MySQL тип DECIMAL имел предел 254 цифры и хранил значения в виде неупакованных строк (один байт на цифру). Однако эти версии СУБД не умели использовать такие большие числа в вычислениях, поскольку тип DECIMAL был просто форматом хранения. При выполнении каких-либо операций значения DECIMAL преобразовывались в тип DOUBLE.
Диапазоны значений и знак целочисленных типов данных
Как вы уже знаете из предыдущего урока, переменная с n-ным количеством бит может хранить 2n возможных значений. Но что это за значения? Это значения, которые находятся в диапазоне. Диапазон — это значения от и до, которые может хранить определенный тип данных. Диапазон целочисленной переменной определяется двумя факторами: её размером (измеряется в битах) и её знаком (который может быть signed или unsigned).
Целочисленный тип signed (со знаком) означает, что переменная может содержать как положительные, так и отрицательные числа. Чтобы объявить переменную как signed, используйте ключевое слово :
signed char c;
signed short s;
signed int i;
signed long l;
signed long long ll;
1 |
signedcharc; signedshorts; signedinti; signedlongl; signedlonglongll; |
По умолчанию, ключевое слово пишется перед типом данных.
1-байтовая целочисленная переменная со знаком (signed) имеет диапазон значений от -128 до 127, т.е. любое значение от -128 до 127 (включительно) может храниться в ней безопасно.
В некоторых случаях мы можем заранее знать, что отрицательные числа в программе использоваться не будут. Это очень часто встречается при использовании переменных для хранения количества или размера чего-либо (например, ваш рост или вес не может быть отрицательным).
Целочисленный тип unsigned (без знака) может содержать только положительные числа. Чтобы объявить переменную как unsigned, используйте ключевое слово :
unsigned char c;
unsigned short s;
unsigned int i;
unsigned long l;
unsigned long long ll;
1 |
unsignedcharc; unsignedshorts; unsignedinti; unsignedlongl; unsignedlonglongll; |
1-байтовая целочисленная переменная без знака (unsigned) имеет диапазон значений от 0 до 255.
Обратите внимание, объявление переменной как unsigned означает, что она не сможет содержать отрицательные числа (только положительные). Теперь, когда вы поняли разницу между signed и unsigned, давайте рассмотрим диапазоны значений разных типов данных:
Теперь, когда вы поняли разницу между signed и unsigned, давайте рассмотрим диапазоны значений разных типов данных:
Размер/Тип | Диапазон значений |
1 байт signed | от -128 до 127 |
1 байт unsigned | от 0 до 255 |
2 байта signed | от -32 768 до 32 767 |
2 байта unsigned | от 0 до 65 535 |
4 байта signed | от -2 147 483 648 до 2 147 483 647 |
4 байта unsigned | от 0 до 4 294 967 295 |
8 байтов signed | от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 |
8 байтов unsigned | от 0 до 18 446 744 073 709 551 615 |
Для математиков: Переменная signed с n-ным количеством бит имеет диапазон от -(2n-1) до 2n-1-1. Переменная unsigned с n-ным количеством бит имеет диапазон от 0 до (2n)-1.
Для нематематиков: Используем таблицу
Начинающие программисты иногда путаются между signed и unsigned переменными. Но есть простой способ запомнить их различия. Чем отличается отрицательное число от положительного? Правильно! Минусом спереди. Если минуса нет, значит число — положительное. Следовательно, целочисленный тип со знаком (signed) означает, что минус может присутствовать, т.е. числа могут быть как положительными, так и отрицательными. Целочисленный тип без знака (unsigned) означает, что минус спереди отсутствует, т.е. числа могут быть только положительными.
Обозначение [ править | править код ]
Использование русской прописной буквы «Б» для обозначения байта регламентирует Межгосударственный (СНГ) стандарт ГОСТ 8.417-2002 («Единицы величин») в «Приложении А» и Постановление Правительства РФ от 31 октября 2009 г. № 879. Кроме того, констатируется традиция использования приставок СИ вместе с наименованием «байт» для указания множителей, являющихся степенями двойки ( 1 Кбайт = 1024 байт , 1 Мбайт = 1024 Кбайт , 1 Гбайт = 1024 Мбайт и т. д., причём вместо строчной «к» используется прописная «К»), и упоминается, что подобное использование приставок СИ не является корректным. По ГОСТ IEC 60027-2-2015 строчная «к» соответствует 1000 и «Ки» — 1024, так 1 КиБ = 1024 Б, 1 кБ = 1000 Б.
Следует учитывать, что в ГОСТ 8.417, кроме «бит», для бита нет однобуквенного обозначения, поэтому использование записи вроде «Мб» как синонима для «Мбит» не соответствует этому стандарту. Но в некоторых документах используется сокращение b для bit: IEEE 1541-2002, IEEE Std 260.1-2004, в нижнем регистре: ГОСТ Р МЭК 80000-13—2016, ГОСТ IEC 60027-2-2015.
В международном стандарте МЭК IEC 60027-2 от 2005 года для применения в электротехнической и электронной областях рекомендуются обозначения:
- bit — для бита;
- o, B — для октета, байта. Причём о — единственное указанное обозначение во французском языке.
Производные единицы [ править | править код ]
Измерения в байтах | ||||||||
---|---|---|---|---|---|---|---|---|
ГОСТ 8.417—2002 | Приставки СИ | Приставки МЭК | ||||||
Название | Обозначение | Степень | Название | Степень | Название | Символ | Степень | |
байт | Б | 10 0 | — | 10 0 | байт | B | Б | 2 0 |
килобайт | Кбайт | 10 3 | кило- | 10 3 | кибибайт | KiB | КиБ | 2 10 |
мегабайт | Мбайт | 10 6 | мега- | 10 6 | мебибайт | MiB | МиБ | 2 20 |
гигабайт | Гбайт | 10 9 | гига- | 10 9 | гибибайт | GiB | ГиБ | 2 30 |
терабайт | Тбайт | 10 12 | тера- | 10 12 | тебибайт | TiB | ТиБ | 2 40 |
петабайт | Пбайт | 10 15 | пета- | 10 15 | пебибайт | PiB | ПиБ | 2 50 |
эксабайт | Эбайт | 10 18 | экса- | 10 18 | эксбибайт | EiB | ЭиБ | 2 60 |
зеттабайт | Збайт | 10 21 | зетта- | 10 21 | зебибайт | ZiB | ЗиБ | 2 70 |
йоттабайт | Ибайт | 10 24 | йотта- | 10 24 | йобибайт | YiB | ЙиБ | 2 80 |
Кратные и дольные приставки для образования производных единиц для байта применяются не как обычно. Уменьшительные приставки не используются совсем, а единицы измерения информации, меньшие, чем байт, называются специальными словами — ниббл (тетрада, полубайт) и бит. Увеличительные приставки кратны либо 1024 = 2 10 , либо 1000 = 10 3 : 1 кибибайт равен 1024 байтам , 1 мебибайт — 1024 кибибайтам или 1024×1024 = 1 048 576 байтам и т. д. для гиби-, теби- и пебибайтов. В свою очередь 1 килобайт равен 1000 байтам , 1 мегабайт — 1000 килобайтам или 1000×1000 = 1 000 000 байтам и т. д. для гига-, тера- и петабайт. Разница между ёмкостями (объёмами), выраженными в кило = 10 3 = 1000 и выраженными в киби = 2 10 = 1024 , возрастает с ростом веса приставки. МЭК рекомендует использовать двоичные приставки — кибибайт, мебибайт, йобибайт и т. п.
Иногда десятичные приставки используются и в прямом смысле, например, при указании ёмкости жёстких дисков: у них гигабайт (гибибайт) может обозначать не 1 073 741 824 = 1024 3 байтов , а миллион килобайтов (кибибайтов), то есть 1 024 000 000 байтов , а то и просто миллиард байтов.
Подпись без знака
Как видно выше, byte в Java составляет 1 байт, short — 2 байта, int — 4 байта, а long — 8 байтов. Все это значения со знаком.
Типы | Минимум | Максимум |
---|---|---|
byte | -2^7 | 2^7-1 |
short | -2^15 | 2^15-1 |
int | -2^31 | 2^31-1 |
long | -2^63 | 2^63-1 |
Выяснилось, что тип байта не совпадает с диапазоном значений , упомянутым выше, из-за использования дополнения. ПосмотретьИсходный код, обратный код, дополнительный кодК пониманию.
Все целочисленные типы в языке C предоставляют соответствующую «беззнаковую» версию, первый бит больше не представляет бит знака. Например, байт без знака в языке C имеет диапазон значений .
Итак, когда программа на C передает беззнаковое число программе Java по сети, как нам его сохранить?
Ответ: используйте подписанный тип, размер которого превышает размер используемого беззнакового типа.
Например: используйте short для обработки байтов без знака и long для обработки целых чисел без знака. Рассмотрим пример использования int (4 байта) для хранения байта без знака (1 байт):
В приведенной выше программе b используется как число без знака, отправленное из фона C, и, наконец, мы используем int для хранения этого байта без знака. Зачем нуженЧто насчет этого шага?
Как видите, беззнаковый байт напрямую преобразуется в int, теряя исходное значение. Зачем выполнятьЭтого достаточно? Смотри ниже
Расширение бита знака
В приведенном выше примере b напрямую преобразуется в int, теряя исходное значение байта без знака. Это связано с тем, что расширение знакового бита произошло во время преобразования байта в int:
Без знака = 1111 1010
Преобразовать в 4-байтовое int:
1111 1111 1111 1111 1111 1111 1111 1010 = дополнение
В Java, когда более узкий целочисленный тип расширяется до более широкого целочисленного типа, происходит расширение знаковых битов:
Для положительных чисел присвойте все старшие биты, которые необходимо расширить до 0;
Для отрицательных чисел присвойте все старшие биты, которые необходимо расширить до 1.
Обратите внимание на следующий код:
Почему не выводится -1?
потому какЕсли исходный тип — char, то независимо от того, до какого типа он будет повышен, выполняется расширение 0, то есть всем старшим битам, которые необходимо раскрыть, присваивается 0.
Байт является типом со знаком, поэтому, когда значение байта -1 (двоичный: 11111111) повышается до char, происходит расширение знакового бита, и знаковый бит равен 1, поэтому добавляется 8 единиц и, наконец, 16 единиц; Затем при обновлении с char до int, потому что это Тип char повышается до других типов, поэтому вместо расширения знака используется нулевое расширение, и результирующее значение int становится 65535.
подводить итоги:
Напомним вышеупомянутыйВопрос: int c = b & 0xff;
Для 0xff это буквальная константа в Java, которая сама по себе является значением типа int. 0xff представлен как 11111111. Для этой литеральной константы Java не рассматривает стоящую перед ней 1. как знаковый бит. Когда происходит расширение знакового бита, он расширяется до «000 … ff».
Когда выполняется b & 0xff, происходит расширение бита знака b:
1111 1111 1111 1111 1111 1111 1111 1010 & 0000 0000 0000 0000 0000 0000 1111 1111 = 0000 0000 0000 0000 0000 0000 1111 1010 = Дополнение
Прямой порядок против обратного порядка
Прямой порядок (big endian) указывает на организацию цифровых данных, которая начинается с «большого» конца слова данных и продолжается в направлении «маленького» конца, где «большой» и «маленький» соответствуют наибольшему значащему и наименьшему значащему битам соответственно.
Обратный порядок (little endian) указывает на организацию, которая начинается с «маленького» конца и продолжается в направлении «большого» конца.
Решение между прямым и обратным порядками байтов не ограничивается схемами памяти и 8-разрядными процессорами. Байт является универсальной единицей в цифровых системах. Подумайте только о персональных компьютерах: пространство на жестком диске измеряется в байтах, ОЗУ измеряется в байтах, скорость передачи данных по USB указывается в байтах в секунду (или в битах в секунду), и это несмотря на тот факт, что 8-разрядные персональные компьютеры полностью устарели. Вопрос о порядке байтов вступает в игру всякий раз, когда цифровая система совмещает хранение или передачу данных на основе байтов с числовыми значениями, длина которых превышает 8 бит.
Инженеры должны знать о порядке байтов, когда данные хранятся, передаются или интерпретируются. Последовательная связь особенно восприимчива к проблемам с порядком байтов, поскольку байты, содержащиеся в многобайтовом слове данных, неизбежно будут передаваться последовательно, обычно либо от MSB до LSB, либо от LSB до MSB.
Порядок байтов в контексте последовательной передачи данных
Параллельные шины не защищены от путаницы с порядком байтов, поскольку ширина шины может быть короче ширины данных. И в этом случае прямой или обратный порядок байтов должен быть выбран для параллельной побайтовой передачи данных.
Примером интерпретации на основе порядка байтов является случай, когда байты данных передаются от модуля датчика на ПК через «последовательный порт» (что в настоящее время почти наверняка означает, что в качестве COM порта используется USB соединение). Допустим, всё, что вам нужно сделать, это вывести эти данные, используя какой-то код MATLAB. Когда вы вводите эти байты в среду MATLAB и конвертируете их в обычные переменные, вы должны интерпретировать значения отдельных байтов в соответствии с порядком, в котором они хранятся в памяти.
Битовый порядок байтов
Нумерация битов — это концепция, аналогичная порядку байтов, но на уровне битов, а не байтов. Порядок следования битов или порядок следования битов на уровне битов относится к порядку передачи битов по последовательной среде. Битовый аналог little-endian (младший бит идет первым) используется в RS-232 , HDLC , Ethernet и USB . Некоторые протоколы используют обратный порядок (например, телетекст , I 2 C , SMBus , PMBus , SONET и SDH ), а использует один порядок для поля метки, а другой порядок для оставшейся части кадра. Обычно существует согласованное представление битов независимо от их порядка в байте, так что последний становится актуальным только на очень низком уровне. Одно исключение вызвано функцией некоторых циклических проверок избыточности для обнаружения всех пакетных ошибок до известной длины, которая будет испорчена, если порядок битов отличается от порядка байтов при последовательной передаче.
Помимо сериализации, термины « порядок следования битов» и « порядок байтов на уровне битов» используются редко, поскольку редко встречаются компьютерные архитектуры, в которых каждый отдельный бит имеет уникальный адрес. Доступ к отдельным битам или битовым полям осуществляется через их числовые значения или, в языках программирования высокого уровня, через присвоенные имена, последствия которых, однако, могут зависеть от машины или не иметь переносимости программного обеспечения .
Бинарный (двоичный)!
Теперь, когда мы рассмотрели биты и байты, мы можем сделать небольшой шаг вперёд и перейти к понятию «двоичный». Двоичный как термин может использоваться как указатель двоичного числа (как в нашем однобайтовом примере выше, где мы перешли от 0000 0000 (десятичное 0) до 1111 1111 (десятичное число 255)), или как поток, некоторые данные или состояние.
Например, мы можем говорить о двоичном потоке данных, когда говорим о нулях и единицах, перемещающихся по компьютерной сети. В таком случае (двоичный поток данных) состояние битов не намагничивается или размагничивается, как когда они хранятся на диске или в кэше, а скорее меняется напряжение (например, +5 Вольт), чтобы указать состояние 1 и ноль вольт, чтобы указать состояние 0.
Мы можем использовать слово двоичный для обозначения данных, хранящихся как двоичные (например, на диске), или как состояние, например, исполняемый файл на компьютере часто называется двоичным. Все эти разные виды использования слова «двоичный» требуют немного времени, чтобы привыкнуть к жаргону.
Зачем нам нужен порядок байтов
Несмотря на сатирическую трактовку Коэном борьбы «big endians» (прямого порядка, от старшего к младшему) против «little endians» (обратного порядка, от младшего к старшему), вопрос о порядке байтов на самом деле очень важен для нашей работы с данными.
Блок цифровой информации – это последовательность единиц и нулей. Эти единицы и нули начинаются с наименьшего значащего бита (least significant bit, LSb – обратите на строчную букву «b») и заканчиваются на наибольшем значащем бите (most significant bit, MSb).
Это кажется достаточно простым; рассмотрим следующий гипотетический сценарий.
32-разрядный процессор готов к сохранению данных и, следовательно, передает 32 бита данных в соответствующие 32 блока памяти. Этим 32 блокам памяти совместно назначается адрес, скажем 0x01. Шина данных в системе спроектирована таким образом, что нет возможности смешивать LSb с MSb, и все операции используют 32-битные данные, даже если соответствующие числа могут быть легко представлены в 16 или даже 8 битами. Когда процессору требуется получить доступ к сохраненным данным, он просто считывает 32 бита с адреса памяти 0x01. Эта система является надежной, и нет необходимости вводить понятие порядка байтов.
Возможно, вы заметили, что слово «байт» в описании этого гипотетического процессора нигде не упоминалось. Всё основано на 32-битных данных – зачем нужно делить эти данные на 8-битные части, если всё оборудование предназначено для обработки 32-битных данных? Вот здесь-то теория и реальность расходятся. Реальные цифровые системы, даже те, которые могут напрямую обрабатывать 32-битные или 64-битные данные, широко использую 8-битный сегмент данных, известный как байт.
Сети
Во многих документах IETF RFC используется термин сетевой порядок , означающий порядок передачи битов и байтов по сети в сетевых протоколах . Среди прочего, исторический RFC 1700 (также известный как Интернет-стандарт STD 2) определил сетевой порядок для протоколов в наборе Интернет-протоколов как , отсюда и использование термина «сетевой порядок байтов» для байтов с прямым порядком байтов. порядок.
Однако не все протоколы используют порядок байтов с прямым порядком байтов в качестве сетевого порядка. Протокол Server Message Block (SMB) использует порядок байтов с прямым порядком байтов. В CANopen многобайтовые параметры всегда отправляются первым младшим байтом (с прямым порядком байтов). То же самое и с Ethernet Powerlink .
В Беркли Sockets API определяет набор функций для преобразования 16-битные и 32-битных чисел и из сетевого порядка байт: (хост-сети короткие) и (хост-сеть длиной) преобразует 16- битовые и 32-битные значения соответственно от машины ( хоста ) к сетевому порядку; и функции преобразования из сети в порядке хоста. Эти функции могут быть не оп на большой обратный порядок байт системы.
В то время как сетевые протоколы высокого уровня обычно рассматривают байт (в основном обозначаемый как октет ) как свою атомарную единицу, самые низкие сетевые протоколы могут иметь дело с упорядочением битов в байте.
Типы данных CHAR и VARCHAR
Типы данных и очень схожи между собой, но различаются по способам их хранения и извлечения.
В столбце типа длина поля постоянна и задается при создании таблицы. Эта длина может принимать любое значение между и (что же касается версии MySQL 3.23, то в ней длина столбца может быть от до ). Величины типа при хранении дополняются справа пробелами до заданной длины. Эти концевые пробелы удаляются при извлечении хранимых величин.
Величины в столбцах представляют собой строки переменной длины. Так же как и для столбцов , можно задать столбец любой длины между и . Однако, в противоположность , при хранении величин типа используется только то количество символов, которое необходимо, плюс один байт для записи длины. Хранимые величины пробелами не дополняются, наоборот, концевые пробелы при хранении удаляются (описанный процесс удаления пробелов отличается от предусмотренного спецификацией ANSI SQL).
Если задаваемая в столбце или величина превосходит максимально допустимую длину столбца, то эта величина соответствующим образом усекается.
Различие между этими двумя типами столбцов в представлении результата хранения величин с разной длиной строки в столбцах и проиллюстрировано следующей таблицей:
Извлеченные из столбцов и величины в каждом случае будут одними и теми же, поскольку при извлечении концевые пробелы из столбца CHAR удаляются.
Если при создании таблицы не был задан атрибут для столбцов, то величины в столбцах типа и сортируются и сравниваются без учета регистра. При задании атрибута величины в столбце сортируются и сравниваются с учетом регистра в соответствии с порядком таблицы ASCII на том компьютере, где работает сервер MySQL. Атрибут не влияет на процессы хранения или извлечения данных из столбца.
Атрибут является «прилипчивым». Это значит, что, если в каком-либо выражении использовать столбец, помеченный как , то сравнение всего выражения будет выполняться как сравнение величины типа.
MySQL может без предупреждения изменить тип столбца или во время создания таблицы.
Временные типы
- DATE — предназначен для хранения даты. Формат: год «YYYY», разделитель, месяц «ММ», разделитель, день «DD». В качестве разделителя может выступать не только дефис «-», но и любой символ отличный от цифры.
- DATETIME — предназначен для хранения и даты и времени суток. Позволяет хранить значения в большом диапазоне, с 1001 до 9999 года, с точностью в одну секунду. Дата и время упаковываются в целое число в формате YYYYMMDDHHMMSS независимо от часового пояса. Под значение отводится восемь байт. По умолчанию MySQL показывает данные типа DATETIME в точно определенном, допускающем сортировку формате: 2008-01-16 22:37:08. Этот способ представления даты и времени согласуется со стандартом ANSI.
- TIME — предназначен для хранения времени суток. Значение вводится и хранится в привычном формате: hh:mm:ss, где hh — часы, mm — минуты, ss — секунды. В качестве разделителя может выступать любой символ отличный от цифры.
- TIMESTAMP — предназначен для хранения даты и времени суток в виде количества секунд, прошедших с полуночи 1 января 1970 года по гринвичскому времени (начало эпохи UNIX). С точки зрения занимаемого места на диске он гораздо эффективнее, чем DATETIME. Для хранения типа TIMESTAMP используется только четыре байта, поэтому он позволяет представить значительно меньший диапазон дат, чем тип DATETIME: с 1970 года до некоторой даты в 2038 году. В MySQL имеют ся функции FROM_UNIXTIME() и UNIX_TIMESTAMP(), служащие для преобразования временной метки UNIX в дату и наоборот. Столбцы типа TIMESTAMP по умолчанию создаются в режиме NOT NULL, если вы не указали значение для столбца, MySQL вставляет в первый столбец типа TIMESTAMP текущее время. Тип TIMESTAMP имеет также специальные свойства, которых нет у типа DATETIME.
- YEAR(N) — предназначен для хранения года. Число N задает формат года: YEAR (2) — 70, а YEAR (4) — 1970. По умолчанию, N = 4.
Типы данных | Формат |
DATETIME | ‘0000-00-00 00:00:00’ |
DATE | ‘0000-00-00’ |
TIMESTAMP | 00000000000000 (длина зависит от количества выводимых символов) |
TIME | ‘00:00:00’ |
YEAR | 0000 |
Символы
CHAR(M)
Строка фиксированной длины, при хранении всегда дополняется пробелами в конце строки до заданного размера. Диапазон параметра M составляет от 0 до 255 символов (от 1 до 255 в версиях, предшествующих MySQL 3.23). Концевые пробелы удаляются при выводе значения. Если не задан атрибут чувствительности к регистру BINARY, то величины CHAR сортируются и сравниваются как независимые от регистра в соответствии с установленным по умолчанию алфавитом. Атрибут NATIONAL CHAR (или его эквивалентная краткая форма NCHAR) представляет собой принятый в ANSI SQL способ указания, что в столбце CHAR должен использоваться установленный по умолчанию набор символов (CHARACTER). В MySQL это принято по умолчанию. CHAR является сокращением от CHARACTER. MySQL позволяет создавать столбец типа CHAR(0). В основном это полезно, если необходимо обеспечить совместимость с некоторыми старыми приложениями, которые зависят от наличия столбца, но реально эту величину не используют. Кроме того, такая возможность может очень пригодиться в случае, если необходим столбец, который может содержать только 2 значения, а именно CHAR(0) (т.е. столбец, который не определен как NOT NULL, занимает только один бит и принимает только 2 значения: NULL или «»).
CHAR эквивалентно CHAR(1).
VARCHAR(M)
Строка переменной длины. С версии 5.0.3 диапазон параметра M составляет от 0 до 65535 символов. Однако, нужно учесть, что это значение распределяется среди всех данных ряда, не считая BLOB и TEXT, которые идут отдельно. Для UTF-8 максимальная длина данных ряда будет приблизительно в три раза меньше, а именно: 21844.
TINYBLOB и TINYTEXT
Столбец типа BLOB или TEXT с максимальной длиной 255 (2^8 — 1) символов.
BLOB и TEXT
Столбец типа BLOB или TEXT с максимальной длиной 65535 (2^16 — 1) символов.
MEDIUMBLOB и MEDIUMTEXT
Столбец типа BLOB или TEXT с максимальной длиной 16777215 (2^24 — 1) символов.
LONGBLOB и LONGTEXT
Столбец типа BLOB или TEXT с максимальной длиной 4294967295 (2^32 — 1) символов. Следует учитывать, что в настоящее время протокол передачи данных сервер/клиент и таблицы MyISAM имеют ограничение 16 Мб на передаваемый пакет/строку таблицы, поэтому пока нельзя использовать этот тип данных в его полном диапазоне.
ENUM(‘значение1′,’значение2’,…)
Перечисление. Перечисляемый тип данных. Объект строки может иметь только одно значение, выбранное из заданного списка величин ‘значение1’, ‘значение2’, …, NULL или специальная величина ошибки «». Список ENUM может содержать максимум 65535 различных величин.
SET(‘значение1′,’значение2’,…)
Набор. Объект строки может иметь ноль или более значений, каждое из которых должно быть выбрано из заданного списка величин ‘значение1’, ‘значение2’, … Список SET может содержать максимум 64 элемента.
См. также «Особенности применения типов ENUM и SET».
Примечания
Если в объявлении типа, вы применили NOT NULL, то рекомендуем тут же задать значение по умолчанию, например так: DEFAULT 0. Иначе в некоторых случаях могут возникнуть проблемы.
Пример. Вычисление размера строки и таблицы
Для хэш-индекса фактическое число контейнеров округляется в сторону увеличения до ближайшей степени числа 2. Например, если заданное число равно 100 000, то фактическое число контейнеров для индекса составляет 131 072.
Рассмотрим таблицу Orders со следующим определением:
Обратите внимание, что эта таблица содержит один хэш-индекс и некластеризованный индекс (первичный ключ). Кроме того, она содержит три столбца фиксированной длины и один столбец переменной длины, при этом один из столбцов допускает значения NULL ()
Допустим, таблица содержит 8379 строк, а средняя длина значений в столбце составляет 78 символов.
Чтобы определить размер таблицы, сначала необходимо определить размер индексов. Для обоих индексов указан показатель bucket_count, равный 10 000. Эта величина округляется в большую сторону до ближайшей степени числа 2: 16384. Поэтому общий размер индексов для таблицы Orders составляет:
Остается найти размер данных таблицы, который равен
(Пример таблицы содержит 8379 строк.) Теперь у нас есть:
Теперь давайте рассчитаем .
-
Столбцы поверхностных типов:
-
Заполнение для столбцов поверхностных типов равно 0, поскольку общий размер столбцов поверхностного типа является четным числом.
-
Массив смещений для столбцов глубоких типов:
-
Массив значений NULL = 1
-
Заполнение массива значений NULL = 1, так как размер массива значений NULL является нечетным числом, а в таблице есть столбцы глубоких типов.
-
Заполнение
-
8 — наибольшее требования выравнивания.
-
Размер на данный момент равен 16 + 0 + 4 + 1 + 1 = 22.
-
Ближайшее число, кратное 8, — это 24.
-
В итоге заполнение составляет 24 – 22 = 2 байта.
-
-
В таблице нет столбцов глубоких типов фиксированной длины (столбцов глубоких типов фиксированной длины: 0).
-
Фактический размер столбца глубокого типа составляет 2 * 78 = 156. Единственный столбец глубокого типа имеет тип .
Для завершения вычисления:
Таким образом, общий размер, занимаемый таблицей в памяти, составляет около 2 мегабайт. Это значение не учитывает потенциальные издержки при выделении памяти, а также управление версиями строк, необходимое для доступа транзакций к этой таблице.
Фактический размер памяти, выделяемый для данной таблицы и используемый ею и ее индексами, можно получить при помощи следующего запроса:
Логический сдвиг вправо Арифметический сдвиг вправо
В Java есть три операции сдвига: сдвиг влево, арифметический сдвиг вправо, логический сдвиг вправо.
Примечание: short, byte, char сначала преобразуются в int перед сдвигом, а затем сдвигаются
Арифметический сдвиг вправо: >>, операция сдвига со знаком, пробел после сдвига вправо дополняется битом знака, если это положительное число, оно дополняется 0, а отрицательное число дополняется 1.
-4>>1
Исходный = 10000000 00000000 00000000 00000100 Дополнение = 11111111 11111111 11111111 11111100 0 После сдвига на 1 цифру вправо 11111111 11111111 11111111 11111110 = дополнение
Логический сдвиг вправо: >>>, независимо от положительных или отрицательных чисел, левый конец дополняется 0.
-1>>>1 Исходный = 10000000 00000000 00000000 00000001 Дополнение = 11111111 11111111 11111111 11111111 1 Сдвинуть на 1 цифру вправо 01111111 11111111 11111111 11111111 = дополнение
Арифметический сдвиг влево: <<, после сдвига влево правый конец дополняется 0.