Документация FirebirdДокументация по FirebirdFirebird 1.5 Quick Start → Работа с базами данных
Firebird home Firebird home Пред.: Устанавливаем FirebirdНачало: Документация FirebirdУровень выше: Firebird 1.5 Quick StartСлед.: Безопасность и надежность

Работа с базами данных

Подключаемся к базе данных
Создаем базу данных с помощью isql
Firebird SQL

Подключаемся к базе данных

В директории examples Вашей инсталляции Firebird лежит образец базы данных - employee.fdb, которую можно использовать «для пробы пера».

Имя сервера и путь

Если Вы вдруг решили переместить образец базы данных на другой диск, убедитесь, что он физически подключен к компьютеру. Разделяемые (shared), присоединенные (mapped) диски или (на Unix) смонтированные (mounted) SMB (Samba) файловые системы не будут работать. Это правило касается любых создаваемых Вами баз данных.

При использовании TCP/IP строка подключения состоит из двух частей: имя сервера и путь к файлу. Формат строки имеет следующий вид:

  • Для Linux-серверов:

    имя-сервера:/путь-к-файлу/имя-файла-базы-данных

    Пример для Linux или другой Posix-системы с именем serverxyz:

    serverxyz:/opt/interbase/examples/employee.fdb

  • Для Windows-серверов:

    имя-сервера:буква-диска:\путь-к-файлу\имя-файла-базы-данных

    Пример для Windows:

    serverxyz:C:\Program Files\Firebird\examples\employee.fdb

Оператор CONNECT

Для подключения к базе данных Firebird пользователь должен аутентифицироваться с использованием имени пользователя и правильного пароля. Кроме того, любому пользователю отличному от SYSDBA, root (Posix - системы), или Administrator (на Windows-системах, если Firebird запущен от имени этого пользователя) необходимо иметь разрешения на доступ к объектам внутри самой базы данных (так называемые объектные привилегии). Для простоты, рассмотрим процедуру аутентификации пользователя SYSDBA с использованием пароля masterkey.

Используем isql

Существует несколько способов подключения к базе данных с использованием утилиты isql. Один из них - это использование isql в интерактивном режиме. Перейдите в подкаталог bin директории, в которой установлена Ваша версия Firebird, и в командной строке наберите isql (для Linux: ./isql) [↵ означает «нажать клавишу Enter»]:

C:\Program Files\Firebird\Firebird_1_5\bin>isql↵
Use CONNECT or CREATE DATABASE to specify a database
SQL>CONNECT "C:\Program Files\Firebird\Firebird_1_5\examples\employee.fdb"↵
CON>user 'SYSDBA' password 'masterkey';↵

Важно

  • В isql каждое SQL-выражение должно завершаться точкой с запятой. Если строка не заканчивается точкой с запятой, и Вы нажимаете клавишу Enter, isql будет считать, что выражение будет продолжаться на следующей строке и сменит приглашение с SQL> на CON>. Это позволяет разбивать длинные выражения на несколько строк. Если Вы нажали клавишу Enter, забыв указать точку с запятой, просто наберите символ после приглашения и нажмите Enter ещё раз.

  • Если, используя Classic Server под Linux, не указать имя хоста, будет предпринята попытка организовать прямое локальное соединение. Что, в свою очередь, может закончиться неудачей в случае отсутствия у текущей учетной записи Linux необходимых прав доступа к файлу базы данных. В этом случае попробуйте подключиться к localhost:/<path>. В этом случае файл будет открывать серверный процесс (который в Firebird 1.5 обычно работает от имени firebird). С другой стороны, попытка сетевого соединения может закончиться неудачно, если пользователь создавал базу данных при локальном подключении и у сервера нет необходимых прав.

  • В случае использования Classic Server под Windows, Вы должны указывать имя хоста (это может быть localhost) и полный путь, в противном случае подключиться не получиться.

Замечание

Несмотря на то, что в Firebird «нормальными» символами разделения строк являются одинарные кавычки, в примере, при указании пути к базе данных, использовались двойные кавычки. Это необходимо, так же как и в некоторых других утилитах командной строки, при указании путей, содержащих пробелы. Одинарные кавычки будут работать для путей, не содержащих пробелы.

Кавычки вокруг «SYSDBA» и «masterkey» необязательны. Также не обязательно заключать в кавычки путь к базе данных, не содержащий пробелов.

Далее isql сообщит о том, что Вы подключились:

DATABASE "C:\Program Files\Firebird\Firebird_1_5\examples\employee.fdb",
User: sysdba
SQL>

Теперь Вы можете продолжить эксперименты с базой employee.fdb. isql означает interactive SQL [utility] (интерактивный SQL). Вы можете использовать её для извлечения данных, получения метаинформации, создания объектов базы данных, запуска скриптов и многого другого.

Для того, чтобы вернуться в командную строку наберите

SQL>QUIT;↵

За дополнительной информацией об использовании isql обращайтесь к Using Firebird, глава 10: Interactive SQL Utility (isql).

Используем графические утилиты

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

Замечание

  • Существуют средства, в которых имя сервера + полный путь ожидаются в виде одной строки

  • Помните, что на Linux и других Posix-системах имена файлов и названия команд являются чувствительными к регистру

Создаем базу данных с помощью isql

Утилита isql позволяет создавать базы данных более, чем одним способом. Мы же рассмотрим простой способ создания базы данных в интерактивном режиме, хотя для серьезного использования Вам, скорее всего, потребуется научиться создавать и использовать скрипты. В руководстве Using Firebird имеется отдельная глава, посвященная этому вопросу.

Запускаем isql

Для создания базы данных с использованием утилиты isql в интерактивном режиме, в командной строке перейдите в директорию bin и наберите isql (Windows) или ./isql (Linux):

C:\Program Files\Firebird\Firebird_1_5\bin>isql↵
Use CONNECT or CREATE DATABASE to specify a database

Оператор CREATE DATABASE

Теперь Вы можете создать базу данных. Предположим, что Вы хотите создать базу данных test.fdb и сохранить её в папке data на диске D:

SQL>CREATE DATABASE 'D:\data\test.fdb' page_size 8192↵
CON>user 'SYSDBA' password 'masterkey';↵

Важно

  • В отличии от оператора CONNECT, в операторе CREATE DATABASE кавычки вокруг пути к файлу, имени пользователя и пароля являются обязательными.

  • Если Вы используете Classic Server под Linux и в пути не указываете имя хоста, будет произведена попытка создать файл базы данных с Вашей учетной записью в Linux в качестве владельца. Может быть это именно то, что Вы и хотите, а может и нет (подумайте о правах доступа, если Вы хотите, чтобы к базе данных мог подключаться кто-то еще). Если же в пути указать, например, localhost:, тогда создавать и влдаеть файлом будет серверный процесс (который в Firebird 1.5 обычно работает от имени firebird).

  • В случае использования Classic Server под Windows, Вы должны указывать имя хоста (которое может быть localhost) плюс полный путь к файлу, в противном случае процесс создания закончится неудачей.

Будет создана база данных и через некоторое время вновь появится приглашение SQL. Теперь Вы подключены к новой базе данных и можете создать какие-нибудь объекты в ней.

Чтобы убедиться, что там действительно база данных, выполните запрос:

SQL>SELECT * FROM RDB$RELATIONS;↵

На экран будет выдано большое количество данных! Этот запрос извлекает все строки из системной таблицы, в которой Firebird хранит метаданные для таблиц. «Пустая» база данных на самом деле не очень-то и пустая – она содержит базу данных, которая будет расти, наполняясь метаданными, по мере создания Вами новых объектов в ней.

Для возвращения в командную строку, наберите

SQL>QUIT;↵

За дополнительной информацией об isql обращайтесь к главе 10 Using Firebird: Interactive SQL Utility (isql).

Firebird SQL

Каждая систем управления базами данных имеет свои отличительные особенности в реализации SQL. По сравнению с любой другой СУБД, за возможным исключением «близкой родственницы» - InterBase®, Firebird наиболее строгим образом соответствует стандарту SQL. Разработчики, переходящие с других продуктов, соответствующих стандарту в меньшей степени, ошибочно воспринимают Firebird странным, притом, что многие мнимые «странности» на самом деле не являются таковыми.

Деление целых чисел

В соответствии со стандартом SQL, Firebird при вычислении частного от деления целого числа на целое округляет результат до ближайшего меньшего целого. В случае если Вы не были готовы, это может слегка шокировать Вас при получении результатов.

Например, следующее вычисление является корректным с точки зрения SQL:

1 / 3 = 0

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

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

1.000 / 3 = 0.333

Что следует знать о строках

Разделительный символ строк

В Firebird строки отделяются парными символами одинарных кавычек – 'Замечательная строка' – (ASCII код - 39, не 96). Если Вы использовали предыдущие версии предшественницы Firebird, InterBase®, Вы можете вспомнить, что там символы одинарных и двойных кавычек использовались одновременно как разделители строк. В Firebird двойные кавычки не могут использоваться в качестве разделителей строк в SQL выражениях.

Апострофы в строках

Если Вам необходимо использовать в строке символ апострофа, Вы можете «экранировать» (escape) его, предварив его другим апострофом.

Например, следующая строка приведет к ошибке:

'Joe's Emporium'

потому, что анализатор проинтерпретирует текст как строку 'Joe', за которой следуют какие-то неизвестные ключевые слова.

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

'Joe''s Emporium'

Обратите внимание на то, что это ДВА символа одинарной кавычки, а не символ двойных кавычек.

Конкатенация строк

В SQL для конкатенации строк используются два символа «трубы» (ASCII 124, в паре без пробела между ними). При этом «+» является символом арифметического сложения, соответственно, при попытке его использования для объединения строк, вы получите сообщение об ошибке. Следующее выражение дополняет значения столбца фразой «Reported by: »:

'Reported by: ' || LastName

Будьте внимательны с конкатенацией и учтите, что Firebird выдаст сообщение об ошибке при попытке соединения значений двух или более столбцов типа char или varchar, чья суммарная потенциальная длина превышает предельный размер для строковых типов (32 Kb).

Кроме этого обратите внимание на нижеизложенный раздел NULL в выражениях относительно конкантенации в выражениях, содержащих NULL.

Идентификаторы в двойных кавычках

До выхода стандарта SQL-92, не допускалось использовать в качестве имен объектов (идентификаторов) ключевые слова, не учитывался регистр букв и не допускались пробельные символы. Стандарт SQL-92 сделал всё это возможным, определив, что идентификаторы должны определяться в парных двойных кавычках (ASCII код - 34) и при использовании также должны выделяться парными кавычками.

Смысл этого «подарка» заключался в упрощении процесса миграции метаданных из нестандартных СУБД в совместимые со стандартом. Обратная сторона медали заключается в том, что если Вы решаете использовать идентификаторы в двойных кавычках, их чувствительность к регистру и заключение их в двойные кавычки становятся обязательными.

При выполнении ограниченного набора условий, Firebird предлагает определенное послабление. Если идентификатор, определенный в двойных кавычках:

  1. был определен в верхнем регистре,

  2. не совпадает с ключевым словом,

  3. и не содержит пробелов,

...тогда он может использоваться в SQL-выражениях без кавычек и учета регистра символов. (Однако, если Вы заключаете идентификатор в кавычки, Вы должны снова учитывать регистр символов!)

Внимание

Не перемудрите с этим делом! Например, если у Вас есть таблицы "TESTTABLE" и "TestTable", определенные в двойных кавычках , и Вы выполняете запрос вида:

SQL>select * from TestTable;

...в результате Вы получите записи из таблицы "TESTTABLE", а не "TestTable"!

Обычно, рекомендуется, в случае отсутствия убедительных причин, избегать использования двойных кавычек при определении идентификаторов. К счастью, Firebird позволяет одновременно использовать идентификаторы в кавычках и без них – поэтому не бывает проблем в случае необходимости использования ключевых слов в качестве идентификаторов в унаследованных базах данных.

Внимание

Некоторые инструменты администрирования по умолчанию принудительно заключают в двойные кавычки все идентификаторы. Постарайтесь выбрать средство, которое позволяет делать это опционально.

NULL в выражениях

В SQL, NULL - это не значение. Это условие, или состояние, элемента данных, в котором его значение не известно, в связи с этим NULL не может выступать в качестве значения. Если NULL участвует в арифметических или других выражениях, результат всегда будет NULL. Это не нуль, не пустота (пробел) или «пустая строка» и NULL не ведет себя как одно из этих значений.

Приведем некоторые, возможно «удивительные» для Вас, примеры вычислений и сравнений с участием NULL:

  • 1 + 2 + 3 + NULL = NULL

  • not (NULL) = NULL

  • 'Home ' || 'sweet ' || NULL = NULL

  • if (a = b) then
      MyVariable = 'Equal';
    else
      MyVariable = 'Not equal';

    Если и a и b - NULL - то после выполнения данного кода, значение MyVariable будет 'Not equal' (не равны). Потому что результат вычисления выражения 'a = b' будет NULL, если хотя бы один из операндов будет NULL. Соответственно, в контексте этого «if...then», NULL ведет себя как FALSE, блок 'then' пропускается и выполняется блок 'else'.

  • if (a <> b) then
      MyVariable = 'Not equal';
    else
      MyVariable = 'Equal';

    В этом примере, MyVariable будет иметь значение 'Equal'(равны), если a - NULL, а b - нет, или наоборот. Объяснение аналогично предыдущему случаю.

  • FirstName || ' ' || LastName

    в результате даст NULL, если хотя бы FirstName или LastName - NULL.

Подсказка

Воспринимайте NULL как НЕИЗВЕСТНО и ощущения странности результатов пропадут! Если значение Number не известно, то результат '1 + 2 + 3 + Number' так же получается не известным (и поэтому NULL). Если содержимое MyString не известно, тогда не известен результат конкатенации 'MyString || YourString' (даже если YourString не-NULL) и т.д.

Подробнее о NULL.

Больше информации об особенностях NULL можно найти в руководстве NULL в СУБД Firebird, доступном по адресу:

Пред.: Устанавливаем FirebirdНачало: Документация FirebirdУровень выше: Firebird 1.5 Quick StartСлед.: Безопасность и надежность
Документация FirebirdДокументация по FirebirdFirebird 1.5 Quick Start → Работа с базами данных