Sql blob что это

Как хранить изображения в MySQL с помощью BLOB

Sql blob что это. 8HOST MySQL BLOBs. Sql blob что это фото. Sql blob что это-8HOST MySQL BLOBs. картинка Sql blob что это. картинка 8HOST MySQL BLOBs

BLOB (или Binary Large Object, большой двоичный объект) – это тип данных MySQL, который позволяет хранить двоичные данные: изображения, мультимедиа и файлы PDF.

Хранить изображения (такие как фотографии и подписи) в базе данных MySQL вместе с другой информацией удобно в том случае, если вы разрабатываете приложения с сильной привязкой к БД (например, портал поиска работы, база данных студентов или финансовое приложение), и в этой БД изображения должны быть синхронизированы с другими данными.

И тогда на помощь приходит тип данных BLOB. Этот подход устраняет необходимость в создании отдельной файловой системы для хранения изображений, а также централизует базу данных, делая ее более портативной и надежной, поскольку данные изолированы от файловой системы. А еще это упрощает создание резервных копий, поскольку вы можете создать один дамп MySQL, содержащий все ваши данные.

Извлечение данных обрабатывается быстрее, а при создании новых записей вы можете быть уверены, что правила проверки данных и ссылочная целостность четко соблюдены (особенно при использовании транзакций MySQL).

В этом мануале мы расскажем о том, как использовать тип данных BLOB для хранения изображений с помощью PHP.

Требования

1: Создание базы данных

Давайте начнем с создания тестовой базы данных для этого проекта. Подключитесь к серверу по SSH, а затем выполните следующую команду, чтобы войти на сервер MySQL как пользователь root:

Введите root-пароль базы данных MySQL и нажмите Enter, чтобы продолжить.

После этого выполните следующую команду, чтобы создать базу данных. В этом руководстве мы назовем ее test_company:

CREATE DATABASE test_company;

После создания БД вы увидите следующее:

Query OK, 1 row affected (0.01 sec)

Теперь нам нужно создать на сервере MySQL учетную запись test_user; не забудьте заменить PASSWORD сложным паролем:

CREATE USER ‘test_user’@’localhost’ IDENTIFIED BY ‘PASSWORD’;

Вы получите следующий результат:

Query OK, 0 rows affected (0.01 sec)

Чтобы предоставить пользователю test_user полные права доступа к базе данных test_company, запустите команду:

GRANT ALL PRIVILEGES ON test_company.* TO ‘test_user’@’localhost’;

Вы должны получить следующий результат:

Query OK, 0 rows affected (0.01 sec)

В завершение нужно сбросить таблицы привилегий, чтобы MySQL перезагрузил права:

На экране должно появиться:

Query OK, 0 rows affected (0.01 sec)

Теперь, когда база данных test_company и пользователь test_user готовы, мы можем перейти к созданию таблицы. Предположим, нам нужна таблица products для хранения списка товаров. Позже мы попробуем вставить и извлечь данные из этой таблицы, чтобы понять, как работает BLOB в MySQL.

Выйдите из оболочки MySQL:

Затем снова войдите в систему, на этот раз – как пользователь test_user:

При появлении запроса введите пароль test_user и нажмите Enter, чтобы продолжить. Затем откройте базу данных test_company, набрав команду:

Перейдя в базу данных test_company, MySQL отобразит такой результат:

Затем создайте таблицу products:

CREATE TABLE `products` (product_id BIGINT PRIMARY KEY AUTO_INCREMENT, product_name VARCHAR(50), price DOUBLE, product_image BLOB) ENGINE = InnoDB;

Эта команда создаст таблицу по имени products. В таблице будет четыре столбца:

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

Query OK, 0 rows affected (0.03 sec)

Выйдите из сервера MySQL:

Вы получите сообщение:

Таблица products готова. Вы можете использовать ее для хранения некоторых записей, включая изображения продуктов. Скоро мы заполним ее данными.

2: Создание PHP-скрипта для заполнения базы данных

На этом этапе мы создадим сценарий PHP, который будет подключаться к базе данных MySQL, созданной в первом разделе руководства. Сценарий подготовит три записи о товарах и вставит их в таблицу products.

Чтобы создать PHP-скрипт, откройте новый файл в текстовом редакторе:

sudo nano /var/www/html/config.php

Затем вставьте в него следующую информацию (замените PASSWORD паролем test_user, который вы создали в разделе 1):

Сохраните и закройте файл.

В этом файле для подключения к базе данных MySQL мы использовали четыре константы PHP:

Следующая строка в файле инициирует PHP Data Object (PDO) и подключается к базе данных MySQL:

Ближе к концу файла мы установили пару атрибутов PDO:

Файл /var/www/html/config.php нужно включить в два сценария PHP, которые мы создадим далее. Они будут отвечать за вставку и извлечение записей соответственно.

Сначала создайте PHP-скрипт /var/www/html/insert_products.php для вставки записей в таблицу products:

sudo nano /var/www/html/insert_products.php

Затем добавьте следующие конфигурации в файл /var/www/html/insert_products.php:

‘product_name’ => ‘VIRTUAL SERVERS’,

‘product_name’ => ‘MANAGED KUBERNETES’,

‘product_name’ => ‘MySQL DATABASES’,

$sql = «INSERT INTO products(product_name, price, product_image) VALUES (:product_name, :price, :product_image)»;

echo «Records inserted successfully»;

Сохраните и закройте файл.

Затем мы создали массив данных о товарах, которые нужно вставить в БД. Помимо product_name и price, которые заданы в виде строк и числовых значений соответственно, сценарий использует встроенную функцию PHP file_get_contents для чтения изображений из внешнего источника и передачи их в виде строк в столбец product_image.

После этого мы подготовили оператор SQL и использовали оператор PHP foreach <…>для вставки каждого продукта в базу данных.

Запустите /var/www/html/insert_products.php в окне браузера, используя следующий URL-адрес (не забудьте заменить your-server-IP внешним IP-адресом сервера):

На экране вы увидите сообщение об успешном выполнении файла – следовательно, записи были вставлены в базу данных.

Records inserted successfully

Итак, мы успешно вставили три записи, содержащие изображения товаров, в таблицу. На следующем этапе мы напишем сценарий PHP для извлечения этих записей и отображения их в браузере.

3: Извлечение и визуализация данных из БД MySQL

Имея ​в базе данных информацию и изображения товаров, вы можете написать второй сценарий PHP, который будет запрашивать и отображать данные в таблице HTML в браузере.

Источник

Использование расширенных типов данных

Скачать драйвер JDBC

В Microsoft JDBC Driver для SQL Server расширенные типы данных JDBC служат для преобразования типов данных SQL Server в форматы, распознаваемые языком программирования Java.

Remarks

В следующей таблице перечислены все стандартные сопоставления между расширенными типами данных SQL Server, типами данных JDBC и типами данных языка программирования Java.

Типы SQL ServerТипы JDBC (java.sql.Types)Типы языка Java
varbinary(max)

Изображение

LONGVARBINARYbyte[] (по умолчанию), Blob, InputStream, String
text

varchar(max)

LONGVARCHARString (по умолчанию), Clob, InputStream
ntext

nvarchar(max)

LONGVARCHAR

LONGNVARCHAR (Java SE 6.0)

String (default), Clob, NClob
XmlLONGVARCHAR

SQLXML

String (default), InputStream, Clob, byte[], Blob, SQLXML
Пользовательский тип 1VARBINARYString (по умолчанию), byte[], InputStream
sqlvariantSQLVARIANTОбъект
geometry

geography

VARBINARYbyte[]

1 Microsoft JDBC Driver для SQL Server поддерживает отправку и получение пользовательских типов CLR в виде двоичных данных, но не поддерживает работу с метаданными CLR.

В следующих разделах приведены примеры использования драйвера JDBC и расширенных типов данных.

Типы данных BLOB, CLOB и NCLOB

Драйвер JDBC реализует все методы интерфейсов java.sql.Blob, java.sql.Clob и java.sql.NClob.

Типы данных большого объема

В большинстве случаев работа с типами данных большого объема предполагает их извлечение из базы данных или добавление в базу данных. В следующих разделах описываются различные способы выполнения этих задач.

Извлечение типов данных большого объема из базы данных

Извлечь тип недвоичных данных большого объема, например типа данных varchar(max) из базы данных, можно путем считывания данных в виде потока символов. В следующем примере для извлечения данных из базы данных и их возвращения в виде результирующего набора используется метод executeQuery класса SQLServerStatement. Затем для считывания данных большого объема из результирующего набора используется метод getCharacterStream класса SQLServerResultSet.

Извлечь тип двоичных данных большого объема, например типа данных varbinary(max) из базы данных, можно несколькими способами. Эффективнее всего считать данные в виде двоичного потока следующим образом:

Кроме того, для считывания данных в виде байтового массива можно следующим образом использовать метод getBytes:

Также можно считать данные в виде BLOB. Однако это менее эффективно, чем два предыдущих способа.

Добавление типов данных большого объема в базу данных

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

Также можно использовать передачу в виде строки или байтов следующим образом:

При наличии на сервере библиотеки изображений и при необходимости загрузки целых двоичных файлов изображений в столбец varbinary(max) эффективнее всего использовать драйвер JDBC, организуя потоки напрямую следующим образом:

Методы CLOB и BLOB для загрузки больших объемов данных неэффективны.

Изменение типов данных большого объема в базе данных

Если нужно заменить экземпляр слова в крупном текстовом файле, например в архивном HTML-файле, можно воспользоваться объектом Clob следующим образом:

Кроме того, можно выполнить все операции на сервере и просто передать параметры в подготовленную инструкцию UPDATE.

Дополнительные сведения о типах данных большого объема ищите в разделе «Использование типов данных большого объема» электронной документации по Microsoft SQL Server.

Тип данных XML

SQL Server содержит тип данных xml, который позволяет хранить XML-документы и фрагменты в базе данных SQL Server. Тип данных xml — это встроенный в SQL Server тип данных, несколько напоминающий другие встроенные типы данных, такие как int и varchar. Аналогично другим встроенным типам, типы данных xml можно использовать следующим образом: как тип переменной, тип параметра, тип возвращаемой функции или тип столбца при создании таблицы, а также в функциях CAST и CONVERT Transact-SQL.

В драйвере JDBC тип данных xml может быть сопоставлен со строкой, байтовым массивом, потоком или объектом CLOB, BLOB или SQLXML. По умолчанию задана строка. Для драйвера JDBC, начиная с версии 2.0, обеспечивается поддержка API-интерфейса JDBC 4.0, что позволяет использовать интерфейс SQLXML. Интерфейс SQLXML определяет методы для обмена данными XML и их обработки. Тип данных SQLXML сопоставляется с типом данных SQL Serverxml. Дополнительные сведения о считывании XML-данных из реляционной базы данных и их записи в нее с типом данных Java SQLXML см. в руководстве по использованию данных XML.

Благодаря реализации типа данных xml в драйвере JDBC обеспечена поддержка следующих возможностей:

Доступ к XML как к стандартным строкам Java UTF-16 для большинства общепринятых методик программирования.

Ввод UTF-8 и других XML-данных с 8-битным кодированием.

Доступ к XML как к байтовому массиву с ведущей меткой следования байтов (BOM) при кодировании в UTF-16 для взаимообмена с другими средствами обработками XML и файлами на диске.

SQL Server требует для XML в кодировке UTF-16 ведущую метку порядка байтов (BOM). Приложение должно использовать эту метку при указании значений параметров XML в виде байтовых массивов. SQL Server всегда выводит XML-значения как строки в кодировке UTF-16 без метки порядка байтов и без внедренного объявления кодировки. Если значения XML извлекаются в формате byte[], BinaryStream или Blob, то для значения ожидается метка следования байтов UTF-16.

Дополнительные сведения о типе данных xml можно найти в разделе «Тип данных XML» электронной документации по SQL Server.

Определяемый пользователем тип данных

В SQL Server пользовательские типы можно использовать в качестве идентификатора столбцов таблицы, как переменную в пакете Transact-SQL или как аргумент функции Transact-SQL или хранимой процедуры.

Дополнительные сведения о применении пользовательских типов данных см. в разделе «Использование и изменение экземпляров пользовательских типов» в электронной документации по SQL Server.

Источник

/привет/мир/etc

Непериодические заметки о программировании

понедельник, 25 мая 2015 г.

О работе с большими объектами в СУБД Oracle

Указанные типы данных можно использовать в СУБД Oracle для определения столбцов таблиц, атрибутов объектных типов и переменных PL/SQL.

Вот краткая характеристика этих типов:

Итак, по месту хранения LOB’ы делятся на

а по содержанию на

Для работы с LOB’ами cоздам таблицу со столбцами соответствующих типов:

Вместе с таблицей были созданы сегменты для хранения больших объектов:

Значение типа LOB может быть

Пустые LOB значения создаются функциями EMPTY_CLOB и EMPTY_BLOB :

Начиная с версии Oracle 9i в SQL и PL/SQL поддерживается неявная конвертация между (N)CLOB и VARCHAR2, что позволяет манипулировать значениями в (N)CLOB столбцах и переменных так, как будто это значения типа VARCHAR2:

Как видим, функции и операторы, работающие с VARCHAR2, перегружены для типа (N)CLOB! При этом преодолеваются ограничения в 4000 символов, свойственные SQL типу VARCHAR2:

А вот операторы сравнения для (N)CLOB работают только в PL/SQL и не работают в SQL:

Выше я воспользовался функциями TO_NCLOB и TO_CLOB для явной конвертации значений VARCHAR2 в значения (N)CLOB. В следующей таблице представлены все функции для конвертации в LOB типы и обратно:

ФункцияГде работает
TO_CLOB(character_data)SQL и PL/SQL
TO_BLOB(raw_data)SQL и PL/SQL
TO_LOB(long_data)SQL and PL/SQL
TO_NCLOB(character_data)SQL и PL/SQL
TO_RAW(blob_data)только PL/SQL

Как видим, функция TO_RAW недоступна в SQL и, отсюда, возможности конвертации между BLOB и RAW в SQL ограничены. Например:

Зато в PL/SQL работают явная и неявная конвертации между BLOB и RAW:

Рассмотренные возможности по работе со значениями LOB как с VARCHAR2 получили название SQL семантика для LOB’ов (SQL semаntics for LOBs). С их использованием связаны некоторые ограничения, как мы увидим ниже.

С точки зрения PL/SQL большие объекты делятся на:

В вышеприведенных примерах с PL/SQL мы имели дело с временными LOB’ами.

Изменения внутренних постоянных LOB’ов (в отличие от внешних или временных) в СУБД Oracle подчиняются транзакциям. Убедимся в этом, отменив только что сделанные изменения:

Типичный алгоритм для чтения или изменения постоянного LOB’а с помощью PL/SQL таков:

Приведу пример выгрузки данных из постоянного CLOB’а во внешний файл. Для доступа к внешним файлам потребуется создать директорию, например:

Альтернативно, можно выгрузить CLOB во внешний файл, пользуясь SQL семантикой для LOB и не прибегая к DBMS_LOB :

Тип данных BFILE содержит указатель на внешний файл, который

Пример чтения BFILE и записи во временный BLOB:

Процедура / ФункцияЧто делает
FILEGETNAMEвозвращает имя директории и файла BFILE
FILEEXISTSпроверяет, что файл BFILE существует
FILEOPENоткрывает файл BFILE
FILEISOPENпроверяет, что файл BFILE открыт
FILECLOSEзакрывает файл BFILE
FILECLOSEALLзакрывает все открытые в сеансе файлы BFILE

Вместо чтения BFILE по частям пакет DBMS_LOB позволяет

Пример загрузки текстового файла во временный CLOB (аналогично можно загрузить и в постоянный CLOB):

Приведу неполный список процедур и функций DBMS_LOB для чтения, анализа и изменения значений BLOB, CLOB и NCLOB:

Процедура / ФункцияЧто делает
APPENDдобавляет один LOB в конец другого
COPYкопирует все или часть содержимого LOB’а в другой LOB
ERASEудаляет все или часть содержимого LOB’а
GETLENGTHвозвращает размер LOB’а
INSTRищет «подстроку» в LOB’е
ISOPENпроверяет, открыт ли LOB
ISTEMPORARYпроверяет, временный ли LOB
READчитает данные LOB’а
SUBSTRполучает «подстроку» из LOB’а
TRIMсокращает размер LOB’а до указанного
WRITEзаписывает данные в LOB
WRITEAPPENDзаписывает данные в конец LOB’а

Следующий эксперимент покажет разницу между внутренними и внешними постоянными LOB’ами. Помещу в поле bfile_col таблицы lobs_tab объект BFILE и скопирую единственную строку таблицы во вторую строку:

Команда INSERT привела к тому, что значения bfile_col в обеих строках связаны с одним и тем же внешним файлом, и его изменение отразится на обоих значениях.

Аналогично, при присваивании BLOB и (N)CLOB переменных в PL/SQL мы получаем независимые копии LOB’ов:

Источник

6.2. работа с blob

Delphi site: daily Delphi-news, documentation, articles, review, interview, computer humor.

Рассмотрим подробнее работу с данными BLOB (большой двоичный объект), подтипами BLOB, особенностями чтения и записи BLOB, обращениям к BLOB с помощью SQL, DSQL и вызовами API.

BLOB предназначен для хранения данных произвольного формата переменной длины и, как правило, значительного размера.

BLOB можно использовать для хранения объектов разной природы и назначения, включая:

• Звуки, видео и другую информацию мультимедиа.

• Текст и данные, включая документы большого объема.

BLOB представляет собой тип данных с динамически изменяемым размером, для этого типа не указываются ни размеры, ни способ кодирования. Внутри таблиц вместо данных BLOB записываются их уникальные Дескрипторы (указатели) фиксированного размера на место их фактического хранения. Благодаря этому доступ к дескрипторам данным BLOB в InterBase осуществляется так же, как к данным, хранимым в других форматах. В отличие от ряда других систем, хранящих данные BLOB типа во внешних файлах, InterBase хранит данные BLOB внутри базы. Для каждого BLOB имеется уникальный дескриптор (указатель) в соответствующей таблице, описывающий местоположение BLOB в базе. Поддержка хранения BLOB в пределах базы данных, позволяет гарантировать их от случайных изменений и унифицировать организацию управления хранением и доступом к данным.

Сочетание непосредственного управления BLOB данными в базе данных и поддержка разнообразных типов делает механизм BLOB InterBase пригодным для поддержки приложений, интенсивно работающих с мультимедиа или хранения больших объемов текстов. Например, для приложений типа магазина, хранящих данные как о продажах, так и образцах типа фотографий, файлов видеозаписи вместе с возможностью обработки заказов и продаж. Другим примером может служить библиотечная система, хранящая данные о книгах, работе абонемента и т.п. вместе с рефератами по всем единицам хранения.

Хранение данных BLOB

• TIFF, PICT, BMP, WMF, GEM, TARGA или другие растровые или векторно-графические файлы. :

• Интерактивные аудио-видео файлы AVI (Audio Video Interleaved) или видео файлы формата QuickTime.

• ASCII, MIF, DOC, RTF, WPx или другие текстовые файлы.

Хотя все виды хранимых в BLOB данных обрабатывается однотипно,, но как для внутренних целей, так и для внешнего использования полезно хранить информацию о типе данных, содержащихся в BLOB. Поскольку имеется много естественных типов данных, которые можно определить как BLOB, InterBase позволяет определить подтип BLOB, обеспечивает семь стандартных подтипов, с помощью которых можно описывать BLOB, а также, практически неограниченное количество пользовательских подтипов.

Таблица 6.4. Подтипы BLOB

ПодтипОписание
0Неструктурированный тип, обычно применимый к двоичным данным или данным неопределенного типа
1Текст
2Двоичное представление языка (BLR)
3Список контроля доступа (Access control list)
4(Резерв для будущего использования)
5Закодированное описание метаданных таблиц
6Описание неуспешных транзакции, работающих с несколькими базами данных

Положительные целые числа зарезервированы для стандартных подтипов InterBase, для части из них предусмотрена и своя обработка.

Столбцы BLOB определяются стандартным образов в командах CREATE TABLE, ALTER TABLE. Например, следующая команда определяет три столбца BLOB:

CREATE TABLE TABLEBLOB (

BLOB2 BLOB SUB_TYPE 1,

Чтобы определить и заданный по умолчанию размер сегмента, и подтип при создании столбца BLOB, используется опция SEGMENT SIZE, записываемая после опции SUB_TYPE. В приведенном ниже примере описывается создание в нашей тестовой базе описание таблицы книг, со держащей столбец REFERAT для хранения текста реферата книги, представляющий собой BLOB типа 0 (произвольный объект) с 80-байтовым сегментом.

CREATE TABLE TBOOK (

REFERAT BLOB sub_type 0 segment size 80,

NUM_ALL SMALLINT DEFAULT 0 NOT NULL,

NUM_PRESENCE SMALLINT DEFAULT 0 NOT NULL) ;

Использование памятидля BLOB

BLOB ID для каждого BLOB хранится в соответствующем поле записи таблицы. BLOB ID указывает на первый сегмент BLOB или на страницу указателей, каждый из которых указывает на сегмент одного или нескольких полей BLOB. BLOB ID можно получить командой SELECT, которая определяет BLOB как адресат.

Работа с BLOB осуществляется на базовом языке. Сам доступ реализуется, как правило, одним из трех способов.

С использованием специально включаемого в программу SQL текста. В этом случае программа перед ее компиляцией обрабатывается специальным препроцессором. Для InterBase таковым является утилита GPRE. В результате ее работы этот текст транслируется в последовательность вызовов функций API. Поскольку аналогичные методы используются и другими СУБД, то это создает возможность с минимальными потерями переходить от работы с одной базы на другую.

Второй способ предполагает прямой вызов функций API. В этом случае программа оказывается явно привязанной к платформе InterBase, зато не требует предварительной препроцессорной обработки. Этот метод наиболее выгоден при написании стандартных функций, например, при создании библиотеки UDF (User Defined Functions).

Третий способ представляет собой использования средств доступа высокого уровня. В самом деле, поскольку работа с объектами BLOB первыми двумя способами достаточно трудоемка и при этом по своей сути стандартна, то было бы странно, если бы не было подобных высокоуровневых средств доступа к ним. В частности в системах C++ Builder и Delphi имеются специальные объекты для работы с BLOB.

Рассмотрим на примерах работу с BLOB различными методами.

В этом разделе будем использовать первый методами.

Использование API будет проиллюстрировано в разделе о создании UDF.

Использование высокоуровневых методов рассмотрим в специальном разделе. Для большинства приложений именно они являются предпочтительными, так как позволяют абстрагироваться от деталей процедур чтения и записи и сосредоточиться только на содержательной части задачи, сохраняя при этом высокую эффективность обработки данных.

Выборка BLOB ID с использованием внедренного SQL показана в следующем примере (тексты этих примеров должны, естественно, перед их выполнением быть обработаны препроцессором). Предварительно создается курсор BLOB, представляющий отдельную строку выборки, содержащей объект BLOB (к курсорам вернемся несколько позже, а пока этот пример следует рассматривать, как иллюстрацию синтаксиса).

Пример 6.6 EXEC SQL

DECLARE BLOBDESC CURSOR FOR SELECT REFERAT FROM TBOOK

Столбцы BLOB определяются так же, как обычные при создании таблиц (см. пример 6.5).

Диаграмма на рис. 6.1 показывает связь между столбцом BLOB, содержащим BLOB ID, и данными, на которые он указывает.

Sql blob что это. dvip10 1. Sql blob что это фото. Sql blob что это-dvip10 1. картинка Sql blob что это. картинка dvip10 1

Рис. 6.1. Связь между столбцом BLOB и данными BLOB.

Длина сегмента BLOB

CREATE TABLE TABLEBLOB (

BLOB1 BLOB SEGMENT SIZE 12 0;

InterBase использует установку длины сегмента, чтобы определить размер внутреннего буфера, в который записывает данные сегмента. Обычно не следует пытаться записывать сегменты большей длины, чем специфицировано в таблице; выполнение таких команд может привести к переполнению буфера и возможному искажению памяти.

Указание длины сегмента п гарантирует, что не более чем п байтов будет прочитано или записано за одну операцию с BLOB.

С некоторыми типами операций, например SELECT, INSERT или UPDATE, можно читать или записывать сегменты BLOB переменной длины.

В следующем примере команды INSERT CURSOR указывается длина сегмента в переменной базового языка segment_length.

Пример 6.8 EXEC SQL

INSERT CURSOR BLOBINS VALUES (:write_segment_buffer INDICATOR :segment_length);

Отмена длины сегмента Можно отменять установку дойны сегмента включением опции MAXIMUM_SEGMENT в инструкции DECLARE CURSOR. Так, следующее объявление курсора BLOB INSERT отменяет длину сегмента, которая была определена для поля BLOB1, увеличивая ее до 1024:

DECLARE BLOBINS CURSOR FOR INSERT BLOB BLOB1 INTO TABLEBLOB MAXIMUM_SEGMENT 10 24;

Примечание. Отмена установки длины сегмента затрагивает только размер сегмента для курсора, но не для столбца таблицы базы данных или других курсоров. Другие курсоры, использующие тот же самый столбец BLOB, поддерживают размер сегмента, который был задан при определении столбца, или могут определить собственные длины.

ДОСТУП К BLOB С ИСПОЛЬЗОВАНИЕМ SQL (ИЗ ПРОГРАММЫ НА ЯЗЫКЕ С)

InterBase поддерживает команды SELECT, INSERT, UPDATE и DELETE для BLOB. Ниже приводятся примеры соответствующих программ, иллюстрирующих применение стандартного SQL для работы с BLOB. (Текст должен быть перед выполнением обработан утилитой Gpre).

Следующая программа выбирает данные BLOB из столбца REFERAT таблицы ТВООК. Для реализации выборки нужно выполнить последовательно ряд действий:

• Объявить переменные базового языка для записи BLOB ID, данных сегментов BLOB и длины сегмента данных.

• Объявить курсор таблицы для выборки требуемого столбца BLOB.

• Объявить курсор для чтения BLOB, необходимый для чтения его сегментов.

• Открыть курсор таблицы и выбрать строку данных, содержащих BLOB.

• Открыть курсор чтения BLOB и выбрать первый сегмент данных.

• Выбрать в цикле остающиеся сегменты.

• Закрыть курсор чтения BLOB.

• Закрывает курсор для таблицы.

1. Объявляются переменные базового языка для записи BLOB ID, данных сегментов BLOB и длины сегмента данных:

BEGIN DECLARE SECTION;

BASED ON TBOOK.REFERAT blob_id;

BASED ON TBOOK.REFERAT.SEGMENT blob_segment_buf;

BASED ON TBOOK.UNIKEY key;

unsigned short blob_seg_len;

END DECLARE SECTION;

DECLARE TABCURSOR CURSOR FOR SELECT UNIKEY, REFERAT FROM TBOOK WHERE REFERAT = 123;

DECLARE BLOBCURSOR CURSOR FOR READ BLOB REFERAT FROM TBOOK;

Длина сегмента столбца BLOB REFERAT определена как 80, курсор BLOB BLOBCURSOR читает максимум 60 байт одновременно.

Чтобы переопределить длину сегмента, указанную в схеме базы данных для REFERAT, используется опция MAXIMUMSEGMENT. Например, следующий код ограничивает каждую операцию чтения BLOB максимумом в 60 байт, и SQLCODE устанавливается в 101, чтобы указать, когда прочитана только часть сегмента (признак конца данных):

DECLARE BLOBCURSOR CURSOR FOR READ BLOB REFERAT FROM TBOOK MAXIMUMJSEGMENT 60;

Независимо от того, какая длина сегмента установлена, за одну операцию чтения считывается ровно один сегмент.

4. Открывается курсор таблицы и выбирается строка данных, содержащая BLOB:

EXEC SQL OPEN TABCURSOR;

FETCH TABCURSOR INTO :key, :blob_id;

Команда FETCH выбирает столбцы UNIKEY и REFERAT в host-переменные key и blob_id соответственно.

5. Открывается курсор чтения BLOB (путем использования BLOB ID), находящийся в переменной blob_id, и выбирается первый сегмент данных BLOB:

OPEN BLOBCURSOR USING :blob_id;

FETCH BLOBCURSOR INTO :blob_segment_buf:blob_seg_len;

Когда операция FETCH завершается, blob_segment_buf содержит первый сегмент данных BLOB, blob_seg_len содержит длину сегмента (число байтов, скопированных в blob_segment_buf).

6. Выбираются остающиеся сегменты в цикле на базовом языке, используя объявленные ранее переменные. После каждой выборки проверяется SQLCODE. Код 100 указывает, что все данные BLOB были выбраны. Код 101 указывает, что в сегменте BLOB еще остались данные. В приведенном примере полученные данные печатаются. Здесь их просто некуда деть, в реальных задачах данные либо сохраняются на диске, либо помещаются в какой-либо объект для последующей визуализации:

printf(«%*.*s», blob_seg_len, blob_seg_len, blob_segment_buf);

FETCH BC INTO :blob_segment_buf:blob_seg_len;

InterBase устанавливает код ошибки 101, когда длина буфера сегмента меньше, чем его специфицированная длина.

Например, как это происходит в нашем случае, если длина буфера сегмента 60, а длина специфицированного сегмента 80, то первый FETCH устанавливает код ошибки 101, указывающий, что в сегменте еще остаются данные. Второй FETCH читает оставшиеся 20 байт данных и устанавливает SQLCODE 0, указывающий, что следующий сегмент готов к чтению, или 100, если это был последний сегмент в BLOB.

7. Закрывает курсор чтения BLOB:

CLOSE BLOBCURSOR; i

8. Закрывает курсор для таблицы:

EXEC SQL CLOSE TABCURSOR;

Вставка данныхв BLOB

Следующая программа полностью аналогична предыдущей, но предназначена для вставки данных в BLOB-столбец REFERAT таблицы ТВООК. Для реализации вставки, также как и выборки нужно выполнить последовательно ряд действий:

• Объявить переменные базового языка для BLOB ID, данных сегмента BLOB и длины сегмента BLOB.

• Объявить BLOB-курсор для вставки.

• Открыть BLOB-курсор для вставки и задать host-переменную для размещения BLOB ID.

• Записать данные сегмента в буфере сегментов.

• Закрыть BLOB-курсор для вставки.

• Выполнить вставку новой строки, содержащей BLOB, в таблицу.

• Зафиксировать изменения в базе.

1. Объявляются переменные базового языка для BLOB ID, данных сегмента BLOB и длины сегмента BLOB:

BEGIN DECLARE SECTION;

BASED ON TBOOK.REFERAT blob_id;

BASED ON TBOOK.REFERAT.SEGMENT blob_segment_buf;

BASED ON TBOOK.UNIKEY key;

unsigned short blob_seg_len;

‘END DECLARE SECTION;

2. Объявляется BLOB-курсор для вставки:

DECLARE BLOBCURSOR CURSOR FOR INSERT INTO TBOOK;

Курсор для работы с таблицей, как в случае выборки, здесь не требуется. Будем считать, что все данные, загружаемой в базу строки, включая первичный ключ, нам известны.

3. Открывается BLOB-курсор для вставки и задается host-переменная для размещения BLOB ID:

OPEN BLOBCURSOR INTO :blob_id;

4. Записываются данные сегмента в буфере сегментов blob seg-mentjbuf, вычисляется длина сегмента данных и используется команда INSERT CURSOR для записи сегмента. Эти действия повторяются в цикле, пока не будут записаны все сегменты BLOB:

char **s_referat; // Массив указателей на строки реферата int n_strings; // Количество строк в реферате

for(int i = 0; i 1Создает ■ контекст- для^ сохранения; BLOB, открывает BLOB ■ для ■ записи и определяет фильтр^ (необязательная ■ опция), который нужно использовать, что-‘ бы транслировать данные: BLOB ■ из одного■ подтипа, в^ другой

ФункцияОписание
isc_get_segment()Читает сегмент из открытого BLOB
isc_open_blob2()Открывает существующий BLOB для выборки и необязательной фильтрации
isc_put_segment()Записывает сегмент BLOB

Примеры использования API приведены в разделе, описывающем работу с UDF (фильтры BLOB).

ДОСТУП К BLOB ИЗ ПРОГРАММ НА C++ BUILDER И DELPHI

Программирование доступа к BLOB из прикладных программ, используя механизм BLOB-курсоров с предварительной обработкой препроцессором GPRE, требует значительных усилий и чревато большим количеством ошибок. Для прикладных программистов одним из лучших решений при реализации приложений, работающих с базами данных в среде Windows, является выбор в качестве средства разработки программ систем C++ Builder и Delphi фирмы Inprise (Borland).

Рассмотрим порядок работы с BLOB в C++ Builder.

В этом случае от прикладного программиста не требуется знание механизма доступа к BLOB. Для чтения данных необходимо установить связь с таблицей, из которой выбираются данные.

При работе с любыми базами данных, включая и локальные файлы, необходимо указать источник данных и описать свойства этих данных и порядок их обработки. Для такого рода работ в C++ Builder (Delphi) предусмотрены специальные объекты. Прежде всего, это такие объекты, как ТТаЫе (таблица) или TQuery (запрос).

При работе с ними необходимо описать некоторые из их свойств. Прежде всего, нужно указать откуда берутся данные. Для этого используется свойство объекта DatabaseName, задающее имя базы данных. Далее нужно указать либо имя таблицы базы данных при работе с таблицами в свойстве TableName объекта ТТаЫе, либо записать команду SQL (в данном случае Select) в свойстве SQL объекта TQuery.

Указанные объекты используют механизм BDE (Borland Database Engine), позволяющий одинаково работать с различными базами данных. Поскольку BDE может работать с разными СУБД, то предварительно нужно провести настройку BDE, это достаточно простая и к тому же разовая процедура. О ней мы поговорим несколько позже. Если используются последние версии C++ Builder, то в них есть средства прямого доступа к InterBase. В этом случае можно воспользоваться объектами ТШТаЫе или TIBQuery. Чтобы не привязываться к конкретным версиям продуктов, остановимся на доступе к данным через BDE.

ВизуализацияикорректировкаданныхБЬОБ Прежде всего, рассмотрим выдачу данных BLOB в визуальный объект. При этом допустима и корректировка этого объекта, которая отражается в базе данных.

Итак, создаем форму и помещаем на нее 4 объекта:

Установим теперь свойство Active объекта Table 1 в true (это эквивалентно открытию таблицы).

Результат работы представлен на рис. 6.2.

Sql blob что это. dvip10 2. Sql blob что это фото. Sql blob что это-dvip10 2. картинка Sql blob что это. картинка dvip10 2

Рис. 6.2. Представление данных базы с BLOB на экране.

На этом можно и закончить нашу работу. При перемещении по таблицы в окне DBMemol будет высвечиваться содержимое очередного реферата. То же самое можно проделать и с BLOB полями, хранящими графические данные, только вместо объекта TDBMemo нужно будет поместить объект TDBImage.

Как видно из сказанного, для этого не понадобилось ни одной строки кода, все сделано стандартными средствами (последние, конечно же, используют соответствующие средства API, но для прикладного программирования это уже не имеет значения).

То же самое можно сделать и использую вместо объекта TTable объекта TQuery.

В этом случае вместо указания имени таблицы нужно указать порядок выборки данных. Для этого нужно указать соответствующую команду SELECT. Для ее задания используется свойство SQL объекта TQuery. В нашем случае это может быть конструкция вида SELECT * FROM ТВООК Для того чтобы автоматически генерировались команды по обновлению данных, свойство RequestLive должно быть установлено в true. Естественно не по любому запросу можно просто сгенерировать необходимые команды изменений, например, если выбираются данные из пяти таблиц с вычисляемыми значениями, то такая генерация просто невозможна, поэтому свойство RequestLive=true применимо только к выборкам из одной таблицы. Подробное описание этих ограничений можно найти в документации по C++Builder и Delphi, но это выходит за рамки данной книги.

Если выбираемые данные не нужно корректировать, то ограничений на вид команды SELECT нет, кроме того процедуры корректировки данных по результатам выборки можно описать и явно, предусматривая соответствующие команды INSERT, UPDATE и DELETE, тогда также команда SELECT может быть любой, например: select * FROM PBOOKAUTHOR

Здесь для выборки используется вообще не таблица, а процедура PBOOKAUTHOR, формирующая список авторов в дополнения к сведениям о книгах. Но о процедурах речь еще впереди.

Запись данных BLOB в файл Запись данных из BLOB в файл с использованием объекта TTable проиллюстрируем следующим примером. Проделаем те же действия по настройке таблиц (запроса), что и в предыдущем примере. Тогда запись в файл будет реализовываться одной строкой кода.

. // Находим нужную строку

// Настраиваемся на работу с BLOB tt->SaveToFile(«AAA.AAA»);

// Записываем данные BLOB в файл При использовании для записи данных из BLOB объекта TQuery код будет совершенно аналогичным:

TBLOBField * tt= dynamic_cast

// Настраиваемся на работу с BLOB tt->SaveToFile(«AAA.AAA»);

// Записываем данные BLOB в файл Записьиз файлавBLOB

Запись данных в BLOB из файла с использованием объекта TTable иллюстрируется следующим примером:

TBLOBField * tt= dynamic_cast

// Настраиваемся на работу с BLOB Tablel->Edit();

// Переводим таблицу в режим редактирования tt->LoadFromFile(«AAA.AAA»);

// Записываем данные из файла в BLOB

При использовании для записи данных в BLOB объекта TQuery код примет следующий вид:

// то есть свойство RequestLive=true

TBLOBField * tt= dynamic_cast

// Настраиваемся на работу с BLOB Queryl->Edit();

// Переводим запрос в режим редактирования tt->LoadFromFile(«AAA.AAA»);

// Записываем данные из файла в BLOB

Если запрос не является обновляемым, то необходимо выдать явно команду UPDATE. Это можно сделать многими способами. Например, можно поступить так.

Установить свойство TQuery CashedUpdate=true. В этом случае вносимые в поля запроса изменения не посылаются в базу, а просто запоминаются на клиенте. Для внесения изменений необходимо выполнить явным образом команду обновления.

Рассмотрим подобное обновление на следующем примере.

Для реализации дополнения необходимо выполнить ряд действий.

• Добавить в форму объект TUpdateSQL, в котором хранятся тексты SQL для внесения изменений. Для них предусмотрены 3 свойства: DeleteSQL, ModifySQL и InsertSQL.

• Связать объект TQuery с TUpdateSQL, задав в свойстве объекта TQuery UpdateObject имя объекта TUpdateSQL. В нашем случае UpdateSQLl.

• В свойства объекта UpdateObject 1 записать запросы на изменение данных:

delete from ТВООК where UNIKEY = :OLD_UNIKEY

update TBOOK set BOOKNM = :BOOKNM,

where UNIKEY = :OLD_UNIKEY

insert into TBOOK (MATHERKEY, BOOKNM, REFERAT) values (MATHERKEY, :BOOKNM, :REFERAT)

Для нашего примера достаточно только свойства ModifySQL, остальные приведены чисто справочно. Значения параметров запросов на изменение данных автоматически берутся на основе значений текущей строки родительского запроса Query 1.

В этом случае процедура обновления данных из файла ААА.ААА будет отличаться от предыдущего примера всего на одну строку и примет вид:

TBLOBField * tt= dynamic_cast

/ / Настраиваемся на работу с BLOB Queryl->Edit();

// Переводим запрос в режим редактирования

// Записываем данные из файла в BLOB // (пока только на клиенте)

// Записываем в базу ЗаписьданныхизBLOB впотокдля последующего чтения В рассматриваемых выше примерах данные BLOB считывались и обрабатывались либо специальными объектами, либо внешними программами (по результатам записи в файл). Если же данные BLOB необходимо обработать непосредственно, то лучше и чтение и запись производить в соответствующие рабочие переменные.

TBLOBField * tt= dynamic_cast

// Настраиваемся на работу с BLOB TBLOBStream *bs = new TBLOBStream(tt, bmRead);

// Создаем поток для чтения из выбранного BLOB Memol->Lines->LoadFromStream(bs);

// Читаем данные из потока в поле приложения delete bs; // удаляем поток Чтениеданныхв BLOB из потока Пример 6.21

// Переводим запрос в режим редактирования TBLOBField * tt=dynamic_cast (Queryl->FieldByName(«JOB_REQUIREMENT»));

// Настраиваемся на работу с BLOB TMemoryStream *bs = new TMemoryStream(); Memol->Lines->SaveToStream(bs);

// Заполняем поток данными из приложения tt->LoadFromStream(bs);

// Выдаем команду на обновление базы (см. пример 6.19)

Фактически, поскольку настроечные операции, связанные с открытием таблиц, запросов выполняются однократно, собственно доступ к данным BLOB реализуется одним или двумя операторами. Причем весь кон троль правильности выполнения действий по доступу к BLOB выполняется стандартными средствами, что снижает вероятность ошибок.

Источник

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *