Справочное руководство по MySQL

         

Справочное руководство по MySQL версии 4.0.11-gamma

Это - справочное руководство по MySQL; оно представляет собой документацию по MySQL версии 4.0.11-gamma. Функциональные изменения отмечены номером версии, в которой они произведены, поэтому это руководство будет полезно при освоении также и более старых версий MySQL. Поскольку данный материал носит чисто справочный характер, в нем не содержится основных положений SQL или сведений по реляционным базам данных.


Общая информация
Об этом руководстве
Соглашения, используемые в данном руководстве
О русском переводе руководства

Что представляет собой MySQL?
История MySQL
Основные возможности MySQL
Насколько стабильным является MySQL?
Насколько большими могут быть таблицы в MySQL?
Вопросы, связанные с Проблемой-2000

Что представляет собой компания MySQL AB?
Бизнес-модель и услуги, оказываемые компанией MySQL AB
Поддержка
Обучение и сертификация
Консультации
Коммерческие лицензии
1О нашей программе партнерства
О рекламе
Как с нами связаться

Лицензии и поддержка MySQL
Поддержка, предлагаемая компанией MySQL AB
Авторские права и лицензии на MySQL
Лицензии на ПО MySQL
Использование ПО MySQL под коммерческой лицензией
Бесплатное использование ПО MySQL по лицензии GPL
Логотипы и торговые марки MySQL AB
Оригинальный логотип MySQL
Логотипы MySQL, которые могут использоваться без письменного разрешения
В каком случае для использования логотипов необходимо письменное разрешение?
Партнерские логотипы MySQL AB
Использование слова MySQL в текстовых документах и презентациях
Использование слова MySQL в названиях компаний и продуктов

Кратко о MySQL 4.x
Поэтапный выпуск
Можно использовать уже прямо сейчас
строенный MySQL
Другие функции, доступные в MySQL 4.0
Функции MySQL 4.x, которые будут добавлены в будущем
MySQL 4.1, следующая ветка в разработке

Источники информации по MySQL
Списки рассылки MySQL
Списки рассылки MySQL
Как задавать вопросы и направлять сообщения об ошибках
Как отправлять отчеты об ошибках или проблемах
Рекомендации по ответам на вопросы, направляемые в список рассылки
Пользователи MySQL на IRC


Насколько MySQL соответствует стандартам?
Каким стандартам соответствует MySQL ?
Запуск MySQL в режиме ANSI
Расширения MySQL к ANSI SQL92
Отличия MySQL от ANSI SQL92
Вложенные SELECTы
Оператор SELECT INTO TABLE
Транзакции и атомарные операции
Хранимые процедуры и триггеры
Внешние ключи
Представления
Символы `--' как начало комментария
Известные ошибки и недостатки проектирования в MySQL

1.10 MySQL и будущее (что предстоит сделать)
Что планируется реализовать в версии в 4.0
Things That Should be in 4.1
Что планируется реализовать в версии 5.0
Что должно быть сделано в ближайшем будущем
То, что надо сделать когда-нибудь
То, чего не планируется делать

Сравнение MySQL с другими СУБД
Сравнение MySQL и mSQL
Как конвертировать инструментальные средства mSQL в MySQL
Различия в клиент-серверных коммуникационных протоколах mSQL и MySQL
Различия в синтаксисе SQL между mSQL 2.0 и MySQL
Сравнение MySQL c PostgreSQL
Стратегии развития MySQL и PostgreSQL
Сравнение возможностей MySQL и PostgreSQL
Тестирование скорости работы MySQL и PostgreSQL

Установка MySQL
Быстрая стандартная установка MySQL
Установка MySQL на Linux
Установка MySQL на Windows
Установка бинарного кода
Подготовка конфигурации MySQL для Windows
Первый запуск сервера

Общие вопросы инсталляции
Как получить MySQL
Проверка целостности пакетов с помощью MD5 Checksums или GnuPG
Операционные системы, поддерживаемые MySQL
Какую версию MySQL использовать
Схемы установки
Как и когда выпускаются обновления
Бинарные коды MySQL, скомпилированные в MySQL AB
Установка бинарного дистрибутива MySQL

Установка исходного дистрибутива MySQL
Обзор быстрой установки
Применение патчей
Типичные опции configure
Установка из экспериментального набора исходных кодов
Проблемы с компиляцией?
Замечания по потокам MIT-pthreads
Дистрибутив исходного кода для Windows

Послеустановочные настройка и тестирование
Проблемы при запуске mysql_install_db
Проблемы при запуске сервера MySQL
Автоматический запуск и остановка MySQL

Апгрейд/даунгрейд MySQL
Модернизация с версии 4.0
Модернизация с версии 3.23 до версии 4.0
Модернизация с версии 3.22 до версии 3.23
Модернизация с версии 3.21 до версии 3.22
Модернизация с версии 3.20 до версии 3.21
Модернизация к иной архитектуре

Заметки по операционным системам
Примечания к Linux (Все версии Linux)
Примечания к бинарным дистрибутивам Linux
Заметки по поводу Linux x86
Примечания к Linux SPARC
Примечания к Linux Alpha
Примечания к Linux PowerPC
Примечания к Linux MIPS
Примечания к Linux IA64
Примечания к Windows
Запуск MySQL на Windows 95, 98 или Me
Запуск MySQL на Windows NT, 2000 или XP
Работа MySQL в среде Windows
Соединение с MySQL на удаленной машине под Windows с использованием SSH
Распределение данных в Windows между несколькими различными дисками
Компиляция MySQL-клиентов в среде Windows
Сравнительные характеристики MySQL под Windows и под Unix
Примечания к Solaris
Примечания к Solaris 2.7/2.8
Примечания к Solaris x86
Примечания к BSD
Примечания к FreeBSD
Примечания к NetBSD
Примечания к OpenBSD 2.5
Примечания к OpenBSD 2.8
Примечания к BSD/OS версий 2.x
Примечания к BSD/OS версий 3.x
Примечания к BSD/OS версий 4.x
Примечания к Mac OS X
Общедоступная бета-версия Mac OS X
Сервер Mac OS X
Примечания к другим Unix-системам
Примечания к бинарному дистрибутиву HP-UX
Примечания к HP-UX версии 10.20
Примечания к HP-UX версий 11.x
Примечания к IBM-AIX
Примечания к SunOS 4
Примечания к Alpha-DEC-UNIX (Tru64)
Примечания к Alpha-DEC-OSF/1
Примечания к SGI Irix
Примечания к Caldera (SCO)
Примечания к Caldera (SCO) Unixware Version 7.0
Примечания к OS/2
Примечания к BeOS
Примечания к Novell NetWare

Замечания по установке Perl
Установка Perl на Unix
Установка ActiveState Perl на Windows
Установка дистрибутива Perl для MySQL на Windows
Проблемы использования интерфейса Perl DBI/DBD

Учебное пособие по MySQL

Подсоединение к серверу и отсоединение от него

Ввод запросов

Создание и использование базы данных
Создание и выбор базы данных
Создание таблицы
Загрузка данных в таблицу
Выборка информации из таблицы
Выборка всех данных
Выборка определенных строк
Выборка определенных столбцов
Сортировка строк
Вычисление дат
Работа с значениями NULL
Сравнение по шаблонам
Подсчет строк
Использование нескольких таблиц

Получение информации о базах данных и таблицах

Примеры стандартных запросов
Максимальное значение столбца
Строка, содержащая максимальное значение некоторого столбца
Максимальное значение столбца для группы
Строка, содержащая максимальное значение некоторого столбца
Использование пользовательских переменных
Использование внешних ключей
Поиск по двум ключам
Подсчет посещений за день
Использование атрибута AUTO_INCREMENT

Использование mysql в пакетном режиме

Запросы проекта "Близнецы.html" (Twin Project)
Поиск нераспределенных близнецов
Вывод таблицы состояний пар близнецов

Использование MySQL совместно с Apache

Администрирование баз данных

Конфигурирование MySQL
Параметры командной строки mysqld
Файлы параметров `my.cnf'
Установка нескольких серверов на один компьютер
Запуск нескольких серверов MySQL на одном компьютере

Общие проблемы безопасности и система привилегий доступа MySQL
Общие принципы обеспечения безопасности
Как обезопасить MySQL от хакеров
Опции запуска mysqld, относящиеся к безопасности
Вопросы безопасности, относящиеся к команде LOAD DATA LOCAL
Функции, выполняемые системой привилегий
Как работает система привилегий
Привилегии, предоставляемые MySQL
Соединение с сервером MySQL
Управление доступом, этап 1: верификация подсоединения
Управление доступом, этап 2: верификация запросов
Причины появления ошибок Access denied ("в доступе отказано.html")

Управление учетными записями пользователей MySQL
Синтаксис команд GRANT и REVOKE
Имена пользователей MySQL и пароли
Когда изменения в привилегиях вступают в силу
Задание изначальных привилегий MySQL
Добавление новых пользователей в MySQL
Ограничение ресурсов пользователя
Задание паролей
Обеспечение безопасности своего пароля
Использование безопасных соединений
Основные сведения
Требования
Параметры команды GRANT

Предотвращение катастроф и восстановление
Резервное копирование баз данных
Синтаксис BACKUP TABLE
Синтаксис RESTORE TABLE
Синтаксис CHECK TABLE
Синтаксис REPAIR TABLE
Использование myisamchk для профилактики таблиц и послеаварийного
Синтаксис запуска myisamchk
Общие опции для myisamchk
Проверочные опции для myisamchk
Опции исправления для myisamchk
Другие опции для myisamchk
Использование памяти утилитой myisamchk
Использование myisamchk для послеаварийного восстановления
Как проверять таблицы на ошибки
Как ремонтировать таблицы
Оптимизация таблиц
Настройка режима профилактики таблиц
Получение информации о таблице

Справочник по языку администрирования баз данных

Синтаксис команды OPTIMIZE TABLE
Синтаксис команды ANALYZE TABLE
Синтаксис команды FLUSH
Синтаксис команды RESET
Синтаксис команды KILL
Синтаксис команды SHOW
Получение информации по базам данных, таблицам, столбцам и индексам
SHOW TABLE STATUS
SHOW STATUS
SHOW VARIABLES
SHOW LOGS
SHOW PROCESSLIST
SHOW GRANTS
SHOW CREATE TABLE

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

Серверные сценарии и утилиты MySQL
Обзор серверных сценариев и утилит
safe_mysqld, оболочка mysqld
Mysqld_multi, программа для управления множеством серверов MySQL
myisampack, MySQL-генератор сжатых таблиц (только для чтения)
mysqld-max, расширенный сервер mysqld

Клиентские сценарии и утилиты MySQL
Обзор клиентских сценариев и утилит
mysql, Утилита командной строки
mysqladmin, Администрирование MySQL-сервера.
Использование mysqlcheck для сопровождения и аварийного восстановления таблиц.
mysqldump, Получение дампов данных и структуры таблицы
mysqlhotcopy, Копирование баз данных и таблиц MySQL
mysqlimport, импорт данных из текстовых файлов
Просмотр баз данных, таблиц и столбцов
perror, разъяснение кодов ошибок
Как запускать SQL-команды из текстового файла

Файлы журналов MySQL
Журнал ошибок
Общий журнал запросов
Журнал обновлений (update)
Бинарный журнал обновлений
Журнал медленных запросов
Обслуживание файлов журналов
Репликация в MySQL

Введение
Как реализована репликация: обзор
Как настроить репликацию
Возможности репликации и известные проблемы
Опции репликации в файле `my.cnf'
SQL-команды, относящиеся к репликации
Часто задаваемые вопросы по репликации
Поиск неисправностей репликации

Оптимизация в MySQL

Oбзор оптимизации
Конструктивные ограничения MySQL/компромиссы
Вопросы переносимости
Для чего мы использовали MySQL?
Набор тестов MySQL (The MySQL Benchmark Suite)
Использование собственных тестов

Оптимизация SELECT и других запросов
Синтаксис оператора EXPLAIN (получение информации о SELECT)
Оценка производительности запроса
Скорость выполнения запросов SELECT
Как MySQL оптимизирует выражения WHERE
Как MySQL оптимизирует DISTINCT
Как MySQL оптимизирует LEFT JOIN и RIGHT JOIN
Как MySQL оптимизирует ORDER BY
Как MySQL оптимизирует LIMIT
Скорость выполнения запросов INSERT
Скорость выполнения запросов UPDATE
Скорость выполнения запросов DELETE
Другие советы по оптимизации

Вопросы блокировок
Как MySQL блокирует таблицы
Вопросы блокирования таблиц

Оптимизация структуры базы данных
Конструктивные особенности MySQL
Сделайте объем данных как можно меньше

Индексы столбцов
Многостолбцовые индексы
Почему так много открытых таблиц?
Открытие и закрытие таблиц в MySQL
Недостатки создания множества таблиц в одной базе данных

Оптимизация сервера MySQL
Настройка параметров системы, компляции и запуска
Настройка параметров сервера
Как компиляция и линкование влияет на скорость MySQL
Как MySQL использует память
Как MySQL использует DNS
Синтаксис команды SET

Вопросы, относящиеся к диску
Использование символических ссылок
Использование символических ссылок для баз данных
Использование символических ссылок для таблиц

Справочник по языку MySQL
Структура языка

Литералы: представление строк и чисел
Cтроки
Числа
Шестнадцатеричные величины
Значения NULL
Имена баз данных, таблиц, столбцов, индексы псевдонимы
Чувствительность имен к регистру
Переменные пользователя
Синтаксис комментариев
`Придирчив'' ли MySQL к зарезервированным словам?

Типы данных столбцов
Числовые типы данных
Типы данных даты и времени
Проблема 2000 года и типы данных
Типы данных DATETIME, DATE и TIMESTAMP
Тип данных TIME
Тип данных YEAR
Символьные типы данных
Типы данных CHAR и VARCHAR
Типы данных BLOB и TEXT
Тип перечисления ENUM
Тип множества SET
Выбор правильного типа данных в столбце
Использование типов столбцов из других баз данных
Требования к памяти для различных типов столбцов

Функции, используемые в операторах SELECT и WHERE
Операторы и функции общего назначения
Круглые скобки
Операторы сравнения
Логические операторы
Функции потока управления программой
Строковые функции
Функции сравнения строк
Чувствительность к регистру
Числовые функции
Арифметические операции
Математические функции
Функции даты и времени
Функции приведения типов
Другие функции
Битовые функции
Разные функции
Функции, используемые в операторах GROUP BY

Обработка данных: SELECT, INSERT, UPDATE, DELETE
Синтаксис оператора SELECT
Синтаксис оператора JOIN
Синтаксис оператора UNION
Синтаксис оператора HANDLER
Синтаксис оператора INSERT
Синтаксис оператора INSERT ... SELECT
Синтаксис оператора INSERT DELAYED
Синтаксис оператора UPDATE
Синтаксис оператора DELETE
Синтаксис оператора TRUNCATE
Синтаксис оператора REPLACE
Синтаксис оператора LOAD DATA INFILE
Синтаксис оператора DO

Определение данных: CREATE, DROP, ALTER
Синтаксис оператора CREATE DATABASE
Синтаксис оператора DROP DATABASE
Синтаксис оператора CREATE TABLE
Молчаливые изменения определений столбцов
Синтаксис оператора ALTER TABLE
Синтаксис оператора RENAME TABLE
Синтаксис оператора DROP TABLE
Синтаксис оператора CREATE INDEX
Синтаксис оператора DROP INDEX

Основные команды пользовательских программ MySQL
Синтаксис команды USE
Синтаксис команды DESCRIBE (Получение информации о столбцах)

Команды управления транзакциями и блокировками в MySQL
Синтаксис команд BEGIN/COMMIT/ROLLBACK
Синтаксис команд LOCK TABLES/UNLOCK TABLES
Синтаксис команды SET TRANSACTION

Полнотекстовый поиск в MySQL
Ограничения для полнотекстового поиска
Тонкая настройка полнотекстового поиска в MySQL
Предстоящие доработки по полнотекстовому поиску

Кэш запросов в MySQL
Как работает кэширование запросов
Конфигурация кэша запросов
Параметры кэша запросов в запросе SELECT
Статус и поддержка кэша запросов

Типы таблиц MySQL

Таблицы MyISAM
Пространство, необходимое для ключей
Форматы таблиц MyISAM
Характеристики статической таблицы (с фиксированной длиной)
Характеристики динамических таблиц
Характеристики сжатых таблиц
Проблемы с таблицами MyISAM.
Повреждения таблиц MyISAM
Clients is using or hasn't closed the table properly

Таблицы MERGE
Проблемы при работе с таблицами MERGE

Таблицы ISAM

Таблицы HEAP

Таблицы InnoDB
Обзор таблиц InnoDB
Параметры запуска InnoDB
Создание табличной области InnoDB
Если во время создания базы данных что-то происходит не так
Создание таблиц InnoDB
Преобразование таблиц MyISAM в формат InnoDB
Ограничения внешнего ключа
Добавление и удаление файлов данных и журналов InnoDB
Создание резервных копий и восстановление баз данных InnoDB
Контрольные точки
Перенесение базы данных InnoDB на другой компьютер
Транзакционная модель InnoDB
Согласованное чтение
Чтение с блокировкой
Блокировка следующего ключа: устранение проблемы с фантомом
Блокировка, осуществляемая различными операторами SQL в InnoDB
Обнаружение и откат взаимоблокировки (deadlock)
Пример работы согласованного чтения в InnoDB
Рекомендации по увеличению производительности
InnoDB Monitor
Реализация многовариантности
Структуры таблиц и индексов
Физическая структура индекса
Буферизация вставок
Адаптивный хешированный индекс
Физическая структура записи
Как работают автоинкрементные столбцы в InnoDB
Управление файловым пространством и дисковый ввод/вывод
Дисковый ввод/вывод
Управление файловым пространством
Дефрагментация таблицы
Обработка ошибок
Ограничения для таблиц InnoDB
Контактная информация для получения данных по InnoDB

Таблицы BDB или Berkeley_DB
Обзор таблиц BDB
Установка BDB
Параметры запуска BDB
Характеристики таблиц BDB
Что нам нужно исправить в BDB в ближайшем будущем:
Операционные системы, поддерживаемые BDB
Ограничения таблиц BDB
Ошибки, которые могут возникнуть при использовании таблиц BDB

Интерфейсы для MySQL
Интерфейс PHP API для MySQL
Общие проблемы MySQL и PHP

Интерфейс Perl API для MySQL
DBI с помощью DBD::mysql
Интерфейс DBI
Больше информации по DBI/DBD

Поддержка ODBC в MySQL
Как установить MyODBC
Как заполнять различные поля в Администраторе ODBC
Параметры подключения для MyODBC
Как сообщать о проблемах с MyODBC
Программы, работающие с MyODBC
Как получить значение столбца AUTO_INCREMENT в ODBC
Составление отчетов о проблемах с MyODBC

Интерфейс C для MySQL
Типы данных C API
Обзор функций интерфейса C
Описание функций интерфейса C


mysql_affected_rows()
mysql_change_user()
mysql_character_set_name()
mysql_close()
mysql_connect()
mysql_create_db()
mysql_data_seek()
mysql_debug()
mysql_drop_db()
mysql_dump_debug_info()
mysql_eof()
mysql_errno()
mysql_error()
mysql_escape_string()
mysql_fetch_field()
mysql_fetch_field_direct()
mysql_fetch_fields()
mysql_fetch_lengths()
mysql_fetch_row()
mysql_field_count()
mysql_field_seek()
mysql_field_tell()
mysql_free_result()
mysql_get_client_info()
mysql_get_host_info()
mysql_get_proto_info()
mysql_get_server_info()
mysql_info()
mysql_init()
mysql_insert_id()
mysql_kill()
mysql_list_dbs()
mysql_list_fields()
mysql_list_processes()
mysql_list_tables()
mysql_num_fields()
mysql_num_rows()
mysql_options()
mysql_ping()
mysql_query()
mysql_real_connect()
mysql_real_escape_string()
mysql_real_query()
mysql_reload()
mysql_row_seek()
mysql_row_tell()
mysql_select_db()
mysql_shutdown()
mysql_stat()
mysql_store_result()
mysql_thread_id()
mysql_use_result()
Описания функций C, связанных с потоками
my_init()
mysql_thread_init()
mysql_thread_end()
mysql_thread_safe()
Описания функций C, доступных во встраиваемом сервере
mysql_server_init()
mysql_server_end()
Основные вопросы и проблемы в использовании интерфейса C
Почему после успешных возвратов функции mysql_query() функция mysql_store_result() иногда возвращает NULL?
Какие результаты можно получить из запроса?
Как получить уникальный идентификатор для последней внесенной строки?
Проблемы линкования с интерфейсом C
Сборка клиентских программ
Как создать клиентскую программу с потоками
ibmysqld, встраиваемая библиотека сервера MySQL
Обзор библиотеки встраиваемого сервера MySQL
Компиляция программ с libmysqld
Ограничения при использовании встраиваемого сервера MySQL
Использование файлов опций с встраиваемым сервером
Что осталось сделать по встраиваемомуому серверу (TODO)
Пример простого встраиваемого сервера
Лицензирование встраиваемого сервера

Интерфейсы C++

Интерфейс Borland C++
Взаимодействие MySQL и Java (JDBC)

Интерфейсы Python API для MySQL

Интерфейсы Tcl API для MySQL

Оболочка Eiffel для MySQL

Расширение MySQL

Внутреннее устройство MySQL
Потоки MySQL
Пакет тестирования MySQL
Выполнение тестового пакета MySQL
Расширение тестового пакета MySQL
Отчет об ошибках в тестовом пакете MySQL

Добавление новых функций в MySQL
Синтаксис CREATE FUNCTION/DROP FUNCTION
Добавление новой определяемой пользователем функции
Последовательность вызова UDF для простых функций
Последовательность вызова UDF для агрегатных функций
Обработка аргументов
Возвращаемые значения и обработка ошибок
Компиляция и установка определяемых пользователем функций
Добавление новых родных функции

Добавление новой процедуры в MySQL
Процедура Analyse
Написание процедуры

Проблемы и распространенные ошибки

Как определить, чем вызваны проблемы

Распространенные ошибки при использовании MySQL
Ошибка Access denied
Ошибка MySQL server has gone away
Ошибка Can't connect to [local] MySQL server
Ошибка Host '...' is blocked
Ошибка Too many connections
Ошибка Some non-transactional changed tables couldn't be rolled back
Ошибка Out of memory
Ошибка Packet too large
Коммуникационные ошибки / Оборванные соединения
Ошибка The table is full
Ошибка Can't create/write to file
Ошибка в клиенте Commands out of sync
Ошибка Ignoring user
Ошибка Table 'xxx' doesn't exist
Ошибка Can't initialize character set xxx
Не найден файл (File not found)

Вопросы, связанные с инсталляцией
Проблемы при линковании с клиентской библиотекой MySQL
Запуск MySQL от обычного пользователем
Проблемы с правами доступа к файлам

Вопросы, связанные с администрированием
Что делать, если работа MySQL сопровождается постоянными сбоями
Как переустановить забытый пароль пользователя root
Как MySQL реагирует на переполнение диска
Где MySQL хранит временные файлы
Как защитить или изменить сокет-файл MySQL `/tmp/mysql.sock'
Проблемы с часовыми поясами

Проблемы, относящиеся к запросам
Чувствительность к регистру при поиске
Проблемы с использованием столбцов типа DATE
Проблемы со значением NULL
Проблемы с alias
Удаление строк из взаимосвязанных таблиц
Решение проблем с отсутствием строк, удовлетворяющих условиям поиска
Проблемы со сравнением чисел с плавающей точкой

Вопросы, связанные с определением таблиц
Проблемы с ALTER TABLE
Как изменить порядок столбцов в таблице
Проблемы, относящиеся к временным (TEMPORARY) таблицам

Привнесенные программы
Интерфейсы (API)
Клиенты
Веб-инструменты
Средства тестирования производительности
Средства аутентификации
Конверторы
Использование MySQL с другими программными продуктами
Утилиты
RPM общих инструментальных программ (преимущественно для RedHat 6.1)
Полезные функции
Программы для Windows
Не вошедшие в категории

Перенос на другие системы

Отладка сервера MySQL
Компиляция MySQL для отладки
Создание трассировочных файлов
Отладка mysqld при помощи gdb
Использование трассировки стека
Использование журналов для определения причин ошибок в mysqld
Создание контрольного примера при повреждении таблиц

Отладка клиента MySQL

Пакет DBUG

Методы блокировки

Замечания по потокам RTS

Различия между разными потоковыми пакетами

Переменные окружения

Регулярные выражения в MySQL

GNU General Public License

Preamble
Terms and conditions for copying, distribution and modification
How to Apply These Terms to Your New Programs

I GNU Lesser General Public License

Preamble
Terms and conditions for copying, distribution and modification
How to Apply These Terms to Your New Libraries

Команды SQL, функциональное оглавление

Концептуальное оглавление

Советы по Delphi

Сборник коротких, но очень практических советов по работе с Delphi

Очень медленный доступ к таблице
Задание псевдонима программным путем
Создание многомерного массива
Нажатие кнопки

Вызов Delphi DLL из MS Visual C++
Хитрость OnCalcFields
Получение идентификатора диска
Открытие и закрытие привода CD-ROM
Просмотр буфера обмена I
Работа с индексами Clipper'а
Как зарегистрировать OCX?
Программное открытие ComboBox

Директивы компилятора, способные увеличить скорость
Панель Управления
HEX -> Integer
CPU Speed routine
Создание db-файла во время работы приложения

Создание события во время выполнения приложения
Частичный показ DateTime
Таблицы dBASE: Структура .DBF-файла
Различные цвета строк в DBCtrlGrid
Перевод в верхний регистр первого вводимого символа
Использование опции MultiSelect в DBGRID
Проблема хранения TDBImage
Копирование текста DBMemo

Пример KeyDown компонента DBNavigator
Событие OnChange компонента DBRadioGroup
DCOM
Получение данных из Program Manager через DDE
Hard mode без перерыва
Задержка выполнения OnChange (Delphi 2)
Ошибка сохранения текста в Memo

Ошибка в руководстве "Getting Started"
Получение констант с определением ошибки функцией LoadStr
Снимок DESKTOP в form.canvas
Центрирование информационного диалога (MessageDlg)
Drag & Drop c Win95 Explorer I
Пример TDrawGrid Drawcell
Массив Edit-компонентов Procedure
Битное кодирование/декодирование I

Перехват ошибок DBEngine
DLL и ресурсы
Исключения в Delphi
FileListBox с двумя колонками...как
Поиск величины при вводе I
Как мне проверить готовность диска 'a:'? I
Как приложению воспользоваться своими шрифтами?
Заголовок TGA-файла

Серийный номер тома
Процедура форматирования
Header1
Оглавление файлов помощи
Вывод окна CPU (дизассемблер)
Изображение не масштабируется
Автоматический logon к локальной InterBase

Переход с Oracle на Interbase
Контроль джойстика в Delphi
Звуковой сигнал при нажатии <ENTER>
Label1
Изменение шрифта в Listbox
TListView, TTreeView

Перехват клавиши SHIFT во время выбора пункта меню
FFT аглоритм для Delphi
Прокрутка Memo
Общий доступ к памяти, распределенной DLL
Предел сегмента данных в 64K
Сообщения Windows
Перекрытие виртуальных методов

AT-команды модема
Добавление события OnMouseLeave
Excel
MAPI и MS Exchange
Delphi/MS Office 97/OLE/VB для приложений
Получение данных из Delphi-приложения в документе Word
Обзор сети
События OnClick/Onchange компонента Notebook
Создание объектных переменных
Конфигурирование ODBC
OLE тестер

Связь с personal Oracle
Ханойская башня
Извлечение из EXE-файла иконки и рисование ее в TImage
Высокоточный таймер
Сканирование версии структуры базы данных
FTP4W32.DLL и Delphi 2.0

Делегирование события
Сокращенное имя каталога
Каталог вашего приложения
Массив компонентов
Пример использования ActiveControl

Производная TOutline
Перемещение мышью панели на форме во время выполнения программы
Форматированные Memo-поля таблиц Paradox
Пример переменного количества параметров
Как избежать использования неактуальных указателей
Как динамически создавать пункты подменю в PopupMenu
Работа с последовательными портами

Управление монитором
Управляющие коды принтера
ProgressBar в StatusBar
Код определения свойств
Пример защиты типа SHAREWARE
Поиск записи с помощью TQuery
Проблемы со шрифтами у QuickReport

Текущий номер записи
Как удалить файлы в корзину
Регистры - доступ и использование вместо WIN.INI
Передача переменных отчета в ReportSmith
Таблицы строк
Чтение текста RichEdit из базы данных
Создание хранителя экрана

Синхронизация двух компонентов Scrollbox
Как создавать ярлыки
События, происходящие в приложениях Delphi при завершении работы Windows
Низкоуровневые процедуры обработки звука
Конструирование Splitter
Имя SQL-таблицы
Обработчик события OwnerDraw в компоненте StatusBar

Реализация собственного потока
Установка атрибутов
Эквивалент Trim$(),Mid$()
Добавление элементов управления в TTabbedNotebook и TNotebook
Создание компонента TTable без формы
Перемещение на страницу Tabset по имени
Больше цветов
Поиск строки текста в наследниках TCustmoEdit
Информация о TDataLink
Dos Copy через TFileStream

Delphi-приложения без форм
Канва от THandle
Рассуждения о потоках
TMetafile - ошибка при работе с памятью
Недокументированный TParser

Ускорение работы TreeView
Подсказка по работе TRegIniFile
Сохранение и чтение из потока данных объекта
TStringList в TIniFile
Пример TWriter/TReader
Огромные числа
Не работает функция Writeln
Получение переменных окружения DOS

Visual Basic "Beep" в Delphi
Пример DDE & WordPerfect

Самоучитель по Delphi 7 для профессионалов

Несколько лет назад книгу по Delphi 2 или 3 надо было начинать с азов объектно-ориентированного программирования (ООП). Многие только переходили к Delphi из DOS, многие использовали Borland Pascal for Windows и работали с Windows API напрямую. Объекты еще были в диковинку, и полное разъяснение новых принципов было просто обязательно.
Но и сейчас писать об этом вполне актуально. Конечно, выросло поколение программистов, которые "с молоком матери" впитали новые понятия. Но от понимания объектов до их грамотного использования — дистанция огромного размера. Для создания более или менее сложных приложений нужны навыки объектно-ориентированного дизайна, а для приложений в свою очередь — четкое знание возможностей вашей среды программирования. Поэтому в данной главе мы постараемся акцентировать внимание читателя на применение ООП в среде Delphi 7.
По сравнению с традиционными способами программирования ООП обладает рядом преимуществ. Главное из них заключается в том, что эта концепция в наибольшей степени соответствует внутренней логике функционирования операционной системы (ОС) Windows. Программа, состоящая из отдельных объектов, отлично приспособлена к реагированию на события, происходящие в ОС. К другим преимуществам ООП можно отнести большую надежность кода и возможность повторного использования отработанных объектов.

Объектно-ориентированное программирование
Несколько лет назад книгу по Delphi 2 или 3 надо было начинать с азов объектно-ориентированного программирования (ООП). Многие только переходили к Delphi из DOS, многие использовали Borland Pascal for Windows и работали с Windows API напрямую. Объекты еще были в диковинку, и полное разъяснение новых принципов было просто обязательно.

Библиотека визуальных компонентов VCL и ее базовые классы
Все классы библиотеки визуальных компонентов произошли от группы базовых классов, которые лежат в основе иерархии VCL. Самый общий предок компонентов — это класс TObject, инкапсулирующий простейший объект. Как известно (см. гл. 1), каждый объект наследует свойства и методы родительского класса. К объекту можно добавить новые свойства и методы, но нельзя удалить унаследованные. Объект-наследник в свою очередь может стать родительским для нового класса, который унаследует возможности всех своих предков.

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

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

Элементы управления Win32
Элементы управления составляют суть пользовательского интерфейса Windows. Всеми программами нужно управлять более или менее единообразно, поэтому в составе ОС имеется набор типовых кнопок, редактирующих элементов, списков выбора и т. п., которыми вы можете "украсить" свои разработки. Перечень этот постоянно пополняется. Во-первых, не дремлет фирма Microsoft. С новыми версиями ее продуктов (главным образом с MS Internet Explorer) поставляются новые элементы управления; содержатся они в библиотеке ComCtl32.dll. Во-вторых, на ниве их создания подвизаются многочисленные сторонние фирмы, оформляющие свои элементы управления в виде элементов ActiveX (файлов OCX). И. в-третьих, достаточное количество элементов написано прямо в Delphi — как в фирме Borland, так и независимыми разработчиками.

Элементы управления Windows XP
В Delphi 7 впервые появилась возможность настраивать пользовательский интерфейс приложений для использования в Windows XP. Для этого в состав ресурсов приложения должен включаться манифест Windows XP. Это дополнение призвано обеспечить корректное взаимодействие элементов управления приложения с системной библиотекой ComCtl32.dll версии 6, используемой в Windows XP. Собственно все особенности работы приложений под управлением Windows XP вызваны именно появлением новой версии этой библиотеки. Впрочем, об этом подробно рассказывается ниже.

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

Действия (Actions) и связанные с ними компоненты
С давних пор повелось, что стандарты на пользовательский интерфейс Windows-приложений Microsoft задает "явочным порядком". Первая громкая история на эту тему связана с появлением в 1994 г. Excel 2.0 for Windows, когда разработчики из Редмонда впервые применили интерфейс со многими документами (впоследствии широко известный как MDI) и даже не подумали задокументировать и опубликовать его. После справедливого возмущения широких кругов программистской общественности Microsoft исправился и теперь новые возможности интерфейса публикуются если не до выхода продукта, то, по крайней мере, ненамного позже. Вспомним, с Internet Explorer появилась панель CoolBar и кнопки, картинки, которые подсвечивались при прохождении над ними курсора мыши. Большинство же новинок связано с флагманским продуктом Microsoft — Office.

Файлы и устройства ввода/вывода
Большинство приложений создаются для того, чтобы обрабатывать данные — это прописная истина. С развитием программных технологий мы имеем возможность получать и посылать все более крупные и сложные массивы данных; однако до сих пор 90% из них хранятся в файлах.

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

Архитектура приложений баз данных
Приложение баз данных, как следует уже из его названия, предназначено для взаимодействия с некоторым источником данных — базой данных (БД). Взаимодействие подразумевает получение данных, их представление в определенном формате для просмотра пользователем, редактирование в соответствии с реализованными в программе бизнес- алгоритмами и возврат обработанных данных обратно в базу данных.

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

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

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

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

Процессор баз данных Borland Database Engine
Любое приложение баз данных имеет в своем составе или использует сторонний механизм доступа к данным, который берет на себя подавляющее большинство стандартных низкоуровневых операций работы с базами данных. Например, любое такое приложение при открытии таблицы БД должно выполнить примерно одинаковый набор операций.

Технология dbExpress
Одной из проблем различных технологий доступа к данным, используемым в приложениях Delphi, является трудность распространения готовых приложений. Для BDE требуется отдельная установка, которая занимает порядка 15 Мбайт дискового пространства, а также специальная настройка псевдонимов (см. гл. 16). ADO предустановлена в операционной системе, но нуждается в настраиваемых провайдерах данных (см. гл. 19). При необходимости обновить версию ADO, дистрибутив вашего приложения "потяжелеет" более чем на 2 Мбайт.

Сервер баз данных InterBase и компоненты InterBase Express
С точки зрения разработчика, за исключением нескольких новых свойств, методика использования этих компонентов в приложениях БД не отличается от стандартной методики (см. часть III). Любой новый компонент, инкапсулирующий набор данных, совершенно обычным образом через компонент TDataSource можно подключить к любому стандартному компоненту отображения данных.

Использование ADO средствами Delphi
Технология ADO завоевала популярность у разработчиков, благодаря универсальности — базовый' набор интерфейсов OLE DB имеется в каждой современной операционной системе Microsoft. Поэтому для обеспечения доступа приложения к данным достаточно лишь правильно указать провайдер соединения ADO и затем переносить программу на любой компьютер, где имеется требуемая база данных и, конечно, установленная ADO.

Технология DataSnap. Механизмы удаленного доступа
Палитра компонентов Delphi содержит специальную страницу DataSnap, на которой доступно большинство рассматриваемых в главах этой части компонентов. Однако при разработке многозвенных приложений нам понадобятся и многие другие компоненты, которым также уделено достаточное внимание.

Сервер приложения
Многозвенные распределенные приложения обеспечивают эффективный доступ удаленных клиентов к базе данных, так как в них для управления доступом к данным применяется специализированное ПО промежуточного слоя. В наиболее распространенной схеме — трехзвенном приложении — это сервер приложения, который выполняет следующие функции:

Клиент многозвенного распределенного приложения
Клиентское ПО в распределенном многозвенном приложении имеет особенности архитектуры, продиктованные его ролью — ведь большая часть бизнес-логики и функций обработки данных сосредоточены в сервере приложений (см. гл. 21). Такая схема призвана обеспечить более высокую эффективность обработки запросов многочисленных удаленных клиентов, а также упрощает обслуживание клиентского ПО. Клиенты, выполняющие лишь необходимый минимум операций, называются "тонкими".

Компоненты Rave Reports и отчеты в приложении Delphi
Компоненты QReport по-прежнему доступны разработчику — пакет DCLQRT70.BPL все так же занимает прочное место в папке \Delphi7\Bin и может быть установлен в Палитру компонентов обычным способом. Да и было бы странно ожидать другого от фирмы Borland, которая бдительно следит за обратной совместимостью приложений. Посмотрите к примеру на страницу Win 3.1 Палитры компонентов — новые поколения программистов никогда не видели "прабабушку" Windows XP, и все же исторические компоненты занимают свое исконное место!

Визуальная среда создания отчетов
Визуальная среда создания отчетов входит в состав генератора отчетов Rave Reports 5.0. В отличие от генератора отчетов Quick Report, который поставлялся с Delphi 6 и более ранними версиями, визуальная среда в Rave Reports значительно облегчает самый трудоемкий этап в процессе создания отчета и его включения в состав приложения — постраничную разработку шаблона отчета.

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

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

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

Динамические библиотеки
Динамические библиотеки (DLL, Dynamic Link Library) играют важную роль в функционировании ОС Windows и прикладных программ. Они представляют собой файлы с откомпилированным исполняемым кодом, который используется приложениями и другими DLL. Реализация многих функций ОС вынесена в динамические библиотеки, которые используются по мере необходимости, обеспечивая тем самым экономию адресного пространства. DLL загружается в память только тогда, когда к ней обращается какой-либо процесс.

Потоки и процессы
Работая с Delphi, нужно иметь в виду: этот замечательный продукт не только упрощает разработку сложных приложений, он использует при этом все возможности операционной системы. Одна из возможностей, которую поддерживает Delphi, — это так называемые потоки (threads) или нити.

Многомерное представление данных
Помимо стандартных компонентов отображения данных в VCL Delphi имеются дополнительные компоненты, которые позволяют представлять данные в виде кросстаба. При этом заставить работать кросстаб с двумя и более полями почти так же просто, как и обычный компонент TDBGrid. Эти компоненты расположены на странице Decision Cube Палитры компонентов.

Использование возможностей Shell API
Разобравшись с механизмами СОМ, вам наверняка захочется "испытать радость общения" с объектами, имеющимися в составе ОС. Microsoft уверенно идет к тому, чтобы все составные части своих операционных систем, как и прочих продуктов, превратить в СОМ-объекты. В этом направлении сделаны большие шаги, и оболочка Windows, и ее файловая система предоставляют интерфейсы СОМ. В Windows 2000, судя по заверениям представителей фирмы, все новые возможности представлены и доступны в виде интерфейсов.

Глубины Indy

Indy отличается от других сокетных компонент, с которыми вы возможно уже знакомы. Если вы никогда не работали с другими сокетными компонентами, возможно, вы найдете, что Indy очень прост, так как Indy работает так как вы ожидали. Если вы уже работали с другими сокетными компонентами, то просто забудьте все, что вы знали. Это будет вам только мешать и вы будете делать ложные предпосылки.
Почти все другие компоненты работают в неблокирующем режиме, асинхронно. Они требуют от вас реагировать на события, создавать машину состояний и часто исполнять циклы ожидания. Например, с другими компонентами, когда вы делаете соединения, то вы должны ожидать событие соединения или крутить цикл ожидания, пока свойство, ухаживающие факт соединение не будет установлено. С Indy, вы просто вызываете метод Connect и просто ждете возврата из него. Если соединение будет успешное, то будет возврат из метода по окончанию соединения. Если же соединение не произойдет, то будет возбуждено исключение.
Работа с Indy аналогична работе с файлами. Indy позволяет поместить весь код в одно место, вместо создания различных разработчиков событий. В дополнение, многие находят Indy более простым в использовании. Indy также разработан на работу с потоками. Если вы имеет проблемы с реализацией чего-либо в Indy, то вернитесь назад и реализуйте это как для файлов.

Методология Indy
Клиент – это процесс, который инициализирует соединение. Обычно, клиенты общаются с одним сервером за раз. Если процессу требуется общаться с несколькими серверами, то создаются несколько клиентов.

Прозрачные прокси
Прозрачные прокси – это прокси, которые не требуют вмешательства в протокол обмена. О наличии прозрачного прокси часто не догадываются разработчики или пользователи (на то они и прозрачные и их нельзя обойти).
Хотя прозрачные прокси не оказывают влияния на клиента, они оказывают влияние на сервера. В большинстве случаев, серверы позади таких прокси скрыты от остального мира. Это позволяет иметь доступ к серверу с другой стороны прокси через его порты и эти порты туннелируются снаружи внутрь.

Небезопасный код
Небезопасный код включает следующее: Абсолютные переменные (Absolute) Функции Addr(), Ptr(), Hi(), Lo(), Swap() Процедуры BlockRead(), and BlockWrite() Процедура Fail() Процедуры GetMem(), FreeMem(), ReallocMem() Ассемблерный код Операторы работы с указателями