Ох уж мне эти базы данных: Sybase (ASE) и datetime
Привет, хабр!
На самом деле пост об одной строчке в документации, как оказалось. Но это было неожиданно, поэтому я решил поделиться с Вами найденным.
Новый проектик, новые таблицы, решил запилить для них тесты, и, в общем-то, был удивлён, когда первый же написанный мной тест сломался на том, что объект, который я закинул в базу, не равен этому же вычинанному из базы объекту.
После повторных запусков стало ясно, что миллисекунды не сходятся. Ну то есть берёшь, такой, объект, говоришь «вот тебе new Date(), а теперь запиши это в БД. А теперь прочти по айдишнику. А теперь equals. Чтоооо? О_о». Как-то так. И, да, внезапно тест может выполниться успешно.
После некоторых копаний выяснилась интересная вещь.
В документации на сайте Sybase есть описание используемых типов данных. Для типа данных datetime ещё в версии 15.0 ASE было лишь это:
если ссылка сломается, то Adaptive Server Enterprise 15.0 > Reference Manual: Building Blocks > System and User-Defined Datatypes > Date and time datatypes, где сказано, что
datetime columns hold dates between January 1, 1753 and December 31, 9999. datetime values are accurate to 1/300 second on platforms that support this level of granularity. Storage size is 8 bytes: 4 bytes for the number of days since the base date of January 1, 1900 and 4 bytes for the time of day.
Ещё раз обращаю внимание на то, что
datetime values are accurate to 1/300 second
В старших 4х байтах хранятся дни, а в младших 4х — время дня. В сутках 24часа*60минут*60секунд*1000миллисекунд = 86_400_000 миллисекунд в сутках, число, которое вполне влазит в 4 байта (0x5_26_5C_00). Даже для знакового бита есть место. Кто-нибудь, поделитесь, пожалуйста, как так нужно хранить время суток, чтобы оно не влезло?
Для версии ASE 15.7 немного расширено описание того, как ведёт себя этот тип данных.
Adaptive Server Enterprise 15.7 > Reference Manual: Building Blocks > System and User-Defined Datatypes > Date and time datatypes
datetime columns hold dates between January 1, 1753 and December 31, 9999. datetime values are accurate to 1/300 second on platforms that support this level of granularity. The last digit of the fractional second is always 0, 3, or 6. Other digits are rounded to one of these three digits, so 0 and 1 round to 0; 2, 3, and 4 round to 3; 5, 6, 7, and 8 round to 6; and 9 rounds to 10… Storage size is 8 bytes: 4 bytes for the number of days since the base date of January 1, 1900 and 4 bytes for the time of day.
То есть записываешь объект ты с одним таймштампом, а вычитываешь «почти то же самое, иногда даже точно такое же». Можно даже немного в будущее (на миллисекунду) отправиться, если выпадет девятка.
Ну, это задокументировано, так что это «не баг, а фича», претензий к Sybase никаких.
При всём при этом в ASE 15.7 есть
bigdatetime columns hold dates from January 1, 0001 to December 31, 9999 and 12:00:00.000000 AM to 11:59:59.999999 PM. Its storage size is 8 bytes. The internal representation of bigdatetime is a 64 bit integer containing the number of microseconds since 01/01/0000.
Мораль этого поста: RTFM and use bigdatetime, Luke!
- Sybase
- не баг — а фича
Sybase
Sybase разработала 3 отдельных самостоятельных продукта, для решения конкретного спектра задач:
Sybase Adaptive Server Enterprise (ASE)
ASE — высокопроизводительная СУБД масштаба предприятия для обработки критически-важной корпоративной информации с непревзойденными показателями производительности на платформах UNIX и Linux. ля решений мелкого и среднего бизнеса, отделов и удаленных филиалов и мобильного сектора, где база данных не превышает десятков гигабайт и постоянное кол-во активных пользователей не превышает 50 подключений. Однако на самом деле уже с 9-ой верси спокойно тянет сто гигобайтные базы данных и с тысячами подключений, о чем правда умалчивается в представительствах Sybase, чтобы не дискредитировать ASE.
SQL Anywhere
Anywhere — это полноценная, компактная, мощная реляционная СУБД для решений масштаба рабочих групп, мобильных и встроенных вычислений. служит для организации базы данных на уровне предприятия, где размер базы может доходить до террабайта, сервер должен обслуживать сотни и даже тысячи подключений и на первое место ставиться защищенность и отказоустойчивость, однако функциональность TSQL и фактически ASE можно рассматривать больше как хранилище данных, где почти вся бизнес-логика должна быть вынесена в клиентское приложение или 3-е звено.
Sybase IQ
IQ — уникальный сервер, специально разработанный для высокоскоростного анализа данных. В отличие от традиционных СУБД, Sybase IQ спроектирован для обработки аналитических, а не транзакционных запросов. Служит для организации единого аналитического хранилища данных. Имея специальные патентованные технологии хранения и обработки данных, позволяет выполнять любой сложности запросы на террабайтных базах данных с тысячами активных подключений. Выглядит и работает как ASA (РСУБД с диалектом WatcomSQL), однако внутри специальный механизм хранения и обработки информации, позволяющий данные хранить по страницам не позаписно, а поколоночно и поддерживающий базу данных в сжатом виде (от 30% до 50% сжатия).
Sybase что это за программа
Sybase SQL Anywhere — это новое название СУБД Watcom SQL фирмы Watcom. Такое название данная СУБД получила, начиная с версии 5.0. Переименование произошло после объединения компаний Sybase и Powersoft в 1995 году, в результате чего фирма Watcom, как составная часть компании Powersoft, вошла в состав корпорации Sybase Inc
Sybase SQL Anywhere представляет собой полнофункциональную СУБД на Intel-платформ для мобильных и небольших групп пользователей Данная СУБД позволяет разрабатывать приложения на основе технологии «клиент-сервер» на платформах Windows NT, Windows 95/98, Windows 3.x, OS/2, NetWare, Solaris/Sparc, HP-UX, AIX, DOS и QNX[ ]. Рассматриваемая СУБД предназначена для разработки приложений по технологии «клиент-сервер».
СУБД SYBASE SQL Anywhere является составным элементом системы SYBASE System 11 и ее последующей версии SYBASE System 11.5 Adaptive. Основным элементом этих систем является мощная СУБД SYBASE SQL. Server. Она позволяет хранить огромные объемы информации и обрабатывать запросы к базам данных с применением технологии клиент-сервер. СУБД SYBASE SQL. Server и SYBASE SQL Anywhere взаимно дополняют друг друга. Разработчики SYBASE SQL Anywhere старались достичь максимальной совместимости баз данных, создаваемых этой СУБД, с базами данных SYBASE SQL Server. Именно этим объясняется включение в SQL Anywhere некоторых элементов SYBASE SQL Server.
SYBASE SQL Anywhere может поставляться как в сетевом варианте СУБД, так и автономном варианте. В последнем случае все компоненты СУБД функционируют на том же компьютере, что и приложение. Для приложений не имеет значение какой вариант СУБД они используют. В рамках локальных сетей взаимодействие с приложениями-клиентами осуществляется посредством таких сетевых протоколов как NetBIOS, TCP/IP и IPX. Базы данных, созданные средствами SQL Anywhere, совместимы с последующими версиями и переносимы между платформами, на которых может функционировать данная СУБД.
- Спецификация ODBC. Данная спецификация предоставляет пользователям унифицированный интерфейс между приложениями и реляционными базами данных, в том числе и базами данных SQL. Этот интерфейс представляет собой совокупность функций. Эти функции организуют взаимодействие приложений с базами данных в операционных системах Windows 3.x, Windows 95/98, OS/2 и Windows NT. Спецификация ODBC представляет собой интерфейс нижнего уровня.
- Встроенный SQL (Embedded SQL interface) позволяет «встраивать» SQL-операторы прямо в тексты программ-приложений на языках C или C++. Впоследствии такие приложения подвергаются обработке специальным препроцессором, который заменяет SQL-операторы на вызовы соответствующих функций и процедур. После этого преобразованные тексты приложений представляют собой тексты программ на языке программирования C или C++.
- DDE-интерфейс. Это технология динамического связывания объектов используемая в операционной системе Windows 3.x.. С ее помощью осуществляется взаимодействие приложений-клиентов, которым требуются данные, с приложениями-серверами эти данные предоставляющие. Для применения этой технологии требуется использование соответствующих программных средств, поддерживающих функционирование DDE-клиента. С другой стороны в качестве серверов необходимо использовать приложения, обеспечивающие режим DDE-сервера. К числу последних относятся такие программные приложения, как Microsoft Access, Microsoft Excel и ряд других. В СУБД SYBASE SQL Anywhere роль DDE-сервера выполняет WSQL (Watcom SQL) DDE Server.
- Высокоуровневый собственный интерфейс WSQL HLI (Watcom SQL High-level interface) обеспечивает на «высоком» уровне взаимодействие между SQL Anywhere и приложениями в средах операционных систем Windows 3.x, Windows 95/98, OS/2 и Windows NT. Данный интерфейс реализован для систем программирования аналогичных Visual Basic (для Windows 95/98 и Windows NT) и REXX (для OS/2).
СУБД SYBASE SQL Anywhere имеет в своем составе сетевой и автономный варианты СУБД.. Эти варианты реализованы в виде компонентам SQL Anywhere server/client и SQL Anywhere engine. SQL Anywhere server/client представляет сетевой вариант СУБД. Он организует взаимодействием приложений с базами данных в рамках локальной вычислительной сети по технологии «клиент-сервер».
Сетевой вариант включает в себя удаленный сервер и клиентскую компоненту; SQL Anywhere server и SQL Anywhere client, соответственно. Функционирование СУБД в рамках сети заключается в следующем. На одной ЭВМ, играющей роль сервера базы данных, запускается удаленный сервер — SQL Anywhere server. Его задача состоит в ожидании запросов от клиентских ЭВМ, их обработке и отправлении результатов клиентов. Во время работы сервера на клиентских ЭВМ функционирует компонента SQL Anywhere client. Она принимает от клиентских приложений запросы.. Эти запросы представляют собой операторы языка SQL, например, SELECT (выбрать данные), UPDATE (модифицировать данные), CALL (вызвать хранимую процедуру) и другие. Полученные запросы компонента SQL Anywhere client отправляет по сети серверу базы данных и ожидает возвращение от него результатов этих запросов.
Компонента SQL Anywhere engine является автономным вариантом рассматриваемой СУБД и представляет собой локальный сервер баз данных. Он реализует технологию «клиент-сервер» в условиях, когда сервер и клиенты функционирует на одной ЭВМ. База данных хранится на этой же ЭВМ. Сервер принимает запросы непосредственно от приложений, обрабатывает их и отправляет приложениям результаты запросов. Наличие такого варианта позволяет проводить автономную отладку приложений. Это имеет большое значение, так как на этапе автономной отладке приложения находятся еще в «сыром» состоянии. Данное обстоятельство может сыграть плохую службы при их отладке в сетевом варианте СУБД, когда используемая база данных является общим ресурсом большого количества пользователей.
Клиентские приложения не различают с каким вариантом СУБД они работают. Одни и те же запросы выполняются для пользователя совершенно одинаково по одним и тем же правилам.
Схема взаимодействия приложений с базой данных в СУБД SYBASE SQL Anywhere приведена на рис. 1.
Рис. 1. Взаимодействие приложений-клиентов с базой данных в различных вариантах СУБД SYBASE SQL Anywhere:
а) Автономный вариант;
б) Сетевой вариант.
- SQL Anywhere server/client — сетевой вариант СУБД..
- SQL Anywhere engine — автономный вариант СУБД;
- SQL Remote — компонента поддержания режима репликаций;
- Sybase SQL Central — утилита администрирования баз данных;
- ISQL (Interactive SQL) — утилита интерактивного взаимодействия с базами данных;
- набор дополнительных утилит для создания баз данных, их сжатия, уничтожения и т.д.
Приведенные компоненты являются элементами стандартной поставки. Кроме стандартной, рассматриваемая СУБД может предлагаться в виде профессиональной поставки. Она имеет еще большее число составляющих. Компоненты стандартной поставки будут рассмотрены далее.
- Таблицы данных — хранят данные, составляющие основное содержание базы данных.
- Ключи — совокупности атрибутов, образующих ключи (первичные и внешние), предназначенные для осуществления ускоренного поиска данных и обеспечения ограничений ссылочной целостности.
- Индексы — специальные таблицы, предназначенные для быстрого поиска требуемой информации в таблицах данных.
- Представления (Views) — связанные совокупности подмножеств таблиц данных, предоставляемых пользователям для ограничения их доступа к таблицам данных. При этом, к одним таблицам доступ запрещается совсем, а в других таблицах доступ разрешается только к некоторым записям этих таблиц.
- Хранимые процедуры и функции— хранимые в базе данных подпрограммы на языке SQL, воспользоваться которые может любой пользователь, имеющий на это право.
В СУБД SYBASE SQL Anywhere используется диалект языка SQL — Watcom SQL. Он соответствует стандартам ANSI SQL/89 Level 2 и IBM SAA. Кроме того, используемый диалект SQL поддерживает новые возможности и расширения стандартов ANSI SQL/92 и IBMs DB2
Вся информация базы данных может размещается в нескольких областях. Область представляет собой файл с расширением db, в которой хранится вся база данных или один из ее фрагментов. Каждая область характеризуется своим именем и файлом, соответствующим этой области. Первоначально база данных занимает только одну область с именем SYSTEM, которой соответствует базовый файл (root file). Затем по мере необходимости пространство внешней памяти базы данный может расширяться за счет добавления новых областей. Эти файлы областей могут быть размещены в любом каталоге на любом диске и любом узле локальной сети.
Физически каждый файл (область) состоит из страниц фиксированного объема. Размер страниц устанавливается при создании базы данных. В страницах размещаются объекты базы данных. В зависимости от размера объектов каждая страница может содержать несколько экземпляров объектов или фрагмент одного из объектов.
Наряду с файлами областями в состав базы данных входит файл для хранения журнала изменений БД — файл с расширением log. Наличие журнала изменений является основой манипулирование данными в рассматриваемой СУБД с использованием механизма транзакций. Такой подход обеспечивает высокую защиту баз данных от возникающих программных и аппаратных сбоев и отказов.
При подготовке материала использовались источники:
https://habr.com/ru/articles/303052/
https://artyom2811.github.io/WEB-INF/programming/databases/sql/databases/sybase/Sybase.html
http://citforum.ru/database/sql_any/sql_01.shtml