CITKIT.ru
3 терабайта свободного софта!
Logo    
IT-рынок Новости мира IT Океан(!) софта на CITKIT.ru Форумы Поступления в библиотеку Учебный центр Курилка
CitForum    CITForum на CD Море(!) аналитической информации! :: CITFORUM.RU
IT-консалтинг Software Engineering Программирование Open Source СУБД Безопасность Internet Сети Операционные системы Hardware

23.05.2005

Google
WWW CITForum.ru

Новости мира IT:

  • 11.05 - Intel создает свою группу по Open Source
  • 11.05 - Банк контролирует использование USB устройств при помощи DeviceLock
  • 11.05 - Microsoft устранила опасную дыру в Windows
  • 11.05 - "Корпорация ОСС" создает антимонопольный альянс операторов IP-телефонии
  • 11.05 - В Mac OS X найдены множественные уязвимости
  • 11.05 - "Билайн" запускает услугу "Мобильная почта"
  • 11.05 - Две критические уязвимости в браузере Firefox 1.0.3
  • 11.05 - IBM покупает начинающую Open Source-компанию Gluecode
  • 11.05 - Microsoft готова к битве с Open Source за школы
  • 11.05 - Sun завершит "открытие" Solaris в ближайшие 45 дней
  • 11.05 - Создатели браузера Firefox выпускают юбилейные монеты в честь 50 миллионов скачанных копий
  • 11.05 - Вышла пятая версия мобильной ОС от Microsoft
  • 11.05 - Поисковые движки умнеют быстрее, чем люди
  • 11.05 - Фишеры постоянно совершенствуются
  • 11.05 - Специалисты прогнозируют появление аналога Google Adsense от "Яндекс"
  • 06.05 - ICANN озаботилась проблемой торговых марок
  • 06.05 - Google патентует сортировку новостей
  • 06.05 - Intel готовит двуядерные процессоры второго поколения
  • 06.05 - Schoolforge-UK и OSC продвигают Open Source в школы
  • 06.05 - Новая версия рекламной программы подстрекает пользователей купить ПО для своего лечения
  • 06.05 - Microsoft продает ряд своих закрытых разработок
  • 06.05 - Google Labs анонсировал ускоритель интернета
  • 06.05 - Microsoft подвешивает пиратам "морковку"
  • 06.05 - В США входят в обиход "интеллектуальные" тележки для супермаркетов
  • 06.05 - Microsoft работает над аналогом PDF
  • 05.05 - Yahoo video search теперь доступен массам
  • 05.05 - Алмазы помогут бороться с хакерами
  • 05.05 - Интернет-охоту хотят запретить
  • 05.05 - Microsoft привлекает блоггеров для теста Longhorn
  • 05.05 - Основатель Red Hat предложил Стиву Джобсу помощь в решении проблемы с торговой маркой
  • 05.05 - Компьютерная система оргкомитета Кубка мира по футболу 2006 года пострадала от червя Sober
  • 04.05 - Cisco Systems представила многофункциональный продукт Adaptive Security Appliance 5500
  • 04.05 - Администрация Евросоюза поддержала идею всеевропейской интернет-библиотеки
  • 04.05 - Компьютерный вирус дарит билеты на чемпионат мира по футболу
  • 04.05 - Лаборатория Касперского: Обзор вирусной активности - апрель 2005
  • 04.05 - Microsoft хочет отсудить у россиянина два домена
  • 04.05 - Сделка между Lenovo и IBM завершена
  • 04.05 - Эпидемия червя Sober.p зафиксирована в Западной Европе
  • 04.05 - Panda Software публикует отчет о вирусной активности за апрель
  • 03.05 - Институт SANS обновил список наиболее опасных уязвимостей

    Архив новостей >>>


  • Введение в MySQL (используя Perl DBI)

    Перевод выполнил Дмитрий Николаев. Оригинал на ангийском лежит здесь: http://www.danchan.com/feature/2000/10/16/mysql/mysql.htm

    Я считаю, что если название статьи не звучит для Вас чуждо, то, возможно, Вы в нужном месте.

    MySQL - это реляционная база данных. MySQL основана на технологии client/server. Все примеры команд MySQL в этой статье могут быть введены прямо в командную строку MySQL. MySQL поддерживает многострочные команды и использует точку с запятой, как разделитель между командами.

    Почему же MySQL, а ни другая база данных SQL?

    Хотя бы потому, что она бесплатна, быстра и имеет хорошую поддержку.

    Данные организуются как ряды и колонки, образующие матрицу. С точки зрения SQL, матрица называется таблицей.

    Лучший способ для C программиста понять что же это такое:

    Каждый ряд - это структурная ссылка.

    Каждая колонка - это член этой структуры.

    Вот обычная структура (класс, объявленный с ключевым словом struct) в C:

    struct users
    {
        int  id;
        char nickname[17];
        char password[17];
        int  socks;
        int  favorite_number;
    };

    Это выглядит как информация, собранная Web-сайтом о пользователе.

    А вот MySQL версия этой структуры:

    create table users
    (
        id              int auto_increment not null,
        nickname        varchar(16) not null,
        password        varchar(16) not null,
        socks           int,
        favorite_number int,
        primary key     (user_id),
        unique          (nickname)
    );

    Несколько похоже, не так ли?

    Вот как будет выглядеть ряд в MySQL:

    +----+----------+----------+-------+-----------------+
    | id | nickname | password | socks | favorite_number |
    +----+----------+----------+-------+-----------------+

    Что же тогда матрица? Вот данные в таблице(матрице) о трёх гипотетических пользователях:

    +----+----------+----------+-------+-----------------+
    |  1 | GdayMate | dingo    |    57 |              42 |
    +----+----------+----------+-------+-----------------+
    |  2 | Javier   | cigar    |     1 |             945 |
    +----+----------+----------+-------+-----------------+
    |  3 | Rolo     | pudding  |     9 |               8 |
    +----+----------+----------+-------+-----------------+

    Фактически эти таблицы - это то, что вы увидете, если введёте в MySQL следующую команду:

    select * from users;

    Звёздочка означает, что мы выбираем все колонки из таблицы.

    Таблица - это структурная основа многомиллиардной годовой индустрии баз данных, которая включает в себя такие компании, как Oracle и Informix.

    Простейшие команды MySQL

    Давайте быстро "пробежим" по простейшим командам MySQL. Вы уже занете команду create.

    create table users
    (
        id              int auto_increment not null,
        nickname        varchar(16) not null,
        password        varchar(16) not null,
        socks           int,
        favorite_number int,
        primary key     (user_id),
        unique          (nickname)
    );

    А что же делать, если хотим увидеть только прозвища и любимые числа пользователей?

    select nickname, favorite_number from users;

    Данная команда даст нам:

    +----------+-----------------+
    | nickname | favorite_number |
    +----------+-----------------+
    | GdayMate |              42 |
    +----------+-----------------+
    |   Javier |             945 |
    +----------+-----------------+
    |     Rolo |               8 |
    +----------+-----------------+

    А если хотим вывести прозвища пользователей, но с условием, что носков у них меньше, чем 10 пар и их любимое число больше, чем 100?

    select nickname from users where socks < 10 and favorite_number > 100;
    +----------+
    | nickname |
    +----------+
    |   Javier |
    +----------+

    Как же ввести данные в таблицу? Это просто.

    insert into users (nickname, socks) values ('Cowlick', 0);

    Да , но мы забыли добавить поле пароля в таблицу!

    create table users
    (
        ...
        password varchar(16) not null,
        ...
    );

    Под NOT NULL понимается то, что поле должно нести в себе какие-либо данные. Поэтому в заданном выше примере MySQL выдаст ошибку. Поэтому следует сделать так:

    insert into users (nickname, password, socks) values ('Cowlick', 'udder', 0);

    Результат будет следующим:

    +----+----------+----------+-------+-----------------+
    | id | nickname | password | socks | favorite_number |
    +----+----------+----------+-------+-----------------+
    |  4 |  Cowlick |    udder |     0 |            NULL |
    +----+----------+----------+-------+-----------------+

    Но подождите! Мы не определили id! Оно также not null.

    create table users
    (
        id int auto_increment not null,
        ...
    );

    В этом случае колонку id мы определили как auto_increment и MySQL сама создаёт значения для нас, добавляя 1 к наибольшему значению, которое найдёт в таблице (Rolo имеет id == 3).

    Мы забыли ввести любимое число пользователя Cowlick. Которое, между прочим, -1. Для этого мы будем использовать команду update.

    update users set favorite_number = -1 where id = 4;

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

    update users set favorite_number = -1 where nickname = 'Cowlick';

    Но вдруг у нас появится больше чем один пользователь с прозвищем Cowlick? В нашем примере этого быть не может, т.к. в командеcreate table мы определили:

    create tables users
    (
        ...
        unique (nickname)
    );

    Если мы попробуем ввести ещё одного пользователя с прозвищем Cowlick, то мы получим ошибку от MySQL.

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

    delete from users where nickname = 'Javier';

    Если же Вы хотите удалить всю таблицу, то необходимо будет сделать следующее.

    drop table users;

    Определение таблицы и все данные после вышеописанной команды будут удалены. Будьте осторожны с этой командой.

    Типы MySQL и primary key

    Мы не говорили о директиве primary key в команде create table.

    create table users
    (
        ...
        primary key    (user_id),
        ...
    )

    Создаётся первичный ключ. Первичный ключ - это особый ключ, который может быть только один для данной таблицы для каждой аблицы. По сути, первичный ключ - это уникальный (UNIQUE) ключ с именем "PRIMARY". Несмотря на привелегированный статус, он функционирует как другой уникальный ключ. Но

    select * from users where user_id = 2;

    быстрее, чем

    select * from users where favorite_number = 945;

    MySQL ограничен маленькими типами данных? Если, конечно, Вы считаете, что 4 гигабайта - это мало, то да. Это размер, который может быть помещён в поля типов LongBlob и LongText.

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

    create table messages
    (
        id           int auto_increment not null,
        user_id      int not null,
        posting_date datetime not null,
        comment_body text
        primary key  (id)
    )

    Этот пример предоставил нам два новых типа: datetime и text.

    Данные колонки datetime структуированы следующим образом: "YYYY-MM-DD hh:mm:ss". В данном примере поdatetime могут быть отсортированы сообщения. Для нас это всего лишь строка.

    Типtextможет содержать данные до 64Kb, что более чем достаточно для сообщения.

    Колонка user_id является реляционной частью Реляционной Системы Управления Базой Данных (РСУБД).

    Вот пример ряда (message_body может быть более длинным):

    +----+---------+---------------------+--------------+
    | id | user_id |        posting_date | message_body |
    +----+---------+---------------------+--------------+
    |  1 |       3 | 2000-10-10 10:00:00 |      Wassup! |
    +----+---------+---------------------+--------------+

    Предположим мы имеем систему голосования, где пользователи могут оценить действительно ли сообщение было достойно чтения или нет. Создадим таблицу, подобную этой:

    create table message_votes
    (
        message_id  int not null,
        user_id     int not null,
        vote        enum('good', 'bad') not null,
        primary key (message_id, user_id)
    );

    В этом примере колонка vote может содержать одно из двух: либо 'good', либо 'bad'.

    Для поиска голосования сообщения можно будет сделать следующее:

    select * from message_votes where message_id = 3;

    , что будет быстрее, чем:

    select * from message_votes where user_id = 2;

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

    select * from message_votes where message_id = 3 and user_id = 2;

    Теперь мы готовы к взаимодействию DBI и MySQL.

    Использование Perl DBI как интерфейс для MySQL

    Почему PERL? Почему не PHP? Как-никак, но считается, что PHP4 достаточно быстр за счёт нового интерпретатора?

    Я отвечу, потому, что Perl - это язык, который наиболее часто сейчас используется. А я люблю идти в ногу со стандартами индустрии. Perl имеет большую поддержку online и большинство книг написано о нём. Существует CPAN, the Comprehensive Perl Archive Network, где Вы можете найти модули для исполнения Ваших самых сокровенных желаний, относительно программирования, конечно :-). DBI даёт Вам интерфейс, который будет работать как с самой примитивной БД, так и с самой последней версией Oracle РСУБД.

    Давайте начнём с соединения с базой данных:

    use DBI;
    
    my $dsn = 'DBI:mysql:my_database:localhost';
    my $db_user_name = 'admin';
    my $db_password = 'secret';
    my ($id, $password);
    my $dbh = DBI->connect($dsn, $db_user_name, $db_password);

    Давайте предположим, что мы получили из формы логин и пароль пользователя. Итак,

    $input_nickname = 'Cowlick' и $input_password = 'udder'

    Естественно наше желание проверить действительно ли введёный пароль соответствует введёному логину в нашей БД.

    my $sth = $dbh->prepare(qq{select id, password from users where nickname = $input_nickname});
    $sth->execute();

    Отмечу отсутствие точки с запятой. При одной команде она не обязательна.

    Как же мы получим результат? Т.к. мы ожидаем всего один ряд то,

    ($id, $password) = $sth->fetchrow_array();
    $sth->finish(): # закончили запрос
    if ($input_password eq $password) # чувствительно к регистру
    {
         ... # вход удачен
    }

    Что же делать если результат - более одной строки? Продолжающиеся запросы к

    $sth->fetchrow_array()

    вернут нам оставшуюся часть данных.

    my $sth = $dbh->prepare(qq{
        select nickname, favorite_number from users
    });
    $sth->execute();
    while (my ($nickname, $favorite_number) =
      sth->fetchrow_array())  # делать выборку данных
                                 # пока ничего не останется
    {
         print "$nickname, $favorite_number\n";
    }
    $sth->finish();

    Если же мы хотим сохранить все результаты для последующего использования

    my (@matrix) = ();
    while (my @ary = $sth->fetchrow_array())
    {
        push(@matrix, [@ary]);  # [@ary] это ссылка
    }
    $sth->finish();

    Ссылка для программистов на C может быть расценена как указатель. Матрица теперь является массивом массивов ссылок или же двумерным массивов ссылок.

    Вы можете достать ряд $i при помощи:

    @{matrix[$i]}

    Или, достать нужный ряд и колонку ($i, $j) в таблице:

    $matrix[$i][$j]

    Для операций MySQL, которые не возвращают результатов можно использовать метод do вместо prepare для того, чтобы выполнить SQL-команду.

    $dbh->do("insert into message_votes
      (message_id, user_id, vote) values (1, 3, 'good')");

    И, наконец, чтобы окончить работу с базой - рассоединение:

    $dbh->disconnect();

     


    ХАЙВЕЙ - лучший российский хостинг-провайдер: хостинг, регистрация доменов, услуга Ваша@почта, поддержка 24 часа


    NetPromoter - единственный российский профессиональный комплекс программ и сервисов для раскрутки сайта и интернет-статистики


    STSS - известный поставщик надежных серверных решений различного назначения на платформе Intel (Xeon) и AMD.


    5-55: the ITIL company. Практический опыт и теоретические знания на лучших семинарах по ITIL и процессам ITSM.


    Подписка на новости IT-портала CITForum.ru
    (библиотека, ftp-архив CITKIT.ru)

    Новые поступления в on-line библиотеку:

    28 апреля

  • Выбор первого дистрибутива Linux: Пособие для начинающих
  • Обфускация и защита программных продуктов
  • Анализ и оптимизация циклов с помощью производящих функций
  • Стратегии объектно-реляционного отображения: систематизация и анализ на основе паттернов

    26 апреля

  • Business Intelligence обещает значительный рост в 2005 году
  • Десять основных тенденций 2005 года в области Business Intelligence и Хранилищ данных
  • Управление эффективностью бизнеса и предсказуемость
  • Увеличение эффективности бизнеса: пять ошибок управления, которых следует избегать
  • Потребность в организационных данных: модель комплексного управления эффективностью бизнеса
  • Технология Хранилищ данных для государственных учреждений
  • Оцените, насколько совершенно ваше Хранилище данных

    21 апреля

  • Исполнение моделей при помощи виртуальной машины
  • Параллельные алгоритмы компьютерной алгебры
  • От стандарта до стандарта (о стандартизации оптических разъемов)
  • За штурвалом IP-станции

    Продолжение дискуссии читателей:

  • Линукс и пользователи, или что мне не нравится в Linux
  • Еще один взгляд на альтернативные ОС (и софт для них)
  • О некомпетентности пользователя Windows
  • Переписка Долгачева В.С. и Монахова В.В.

    19 апреля

  • Межпротокольный шлюз NAT-PT с функциями DNS-ALG и FTP-ALG для обеспечения взаимодействия между сетями IPv4 и IPv6
  • Рефакторинг архитектуры программного обеспечения: выделение слоев
  • Комбинаторика слов и построение тестовых последовательностей
  • Функциональное тестирование Web-приложений на основе технологии UniTesK

    14 апреля

  • Как организовать двойную парольную защиту данных в Oracle
  • Деревянный интерфейс

    Продолжение дискуссии читателей:

  • Microsoft против мира
  • Впечатления от прочитанного

    12 апреля

  • Крупные проблемы и текущие задачи исследований в области баз данных
  • Глава 2 из книги Т.Кайта "Oracle для профессионалов"Архитектура

    Дискуссия читателей о Linux и Windows:

  • Деньги правят миром, и у кого их больше, тот и прав!
  • О злокозненности некомпетентных пользователей, или почему я не люблю ограниченных пользователей Windows

    7 апреля

  • О доблести Билла Гейтса, или почему Windows лучше, чем LINUX или Mac OS
  • Витая пара - все ли так просто?!
  • Выбираем сервер печати
  • Один слой хорошо, а два - лучше (о пишущих DVD-приводах)

    5 апреля

  • Использование Caché SQL Gateway
  • Глава 19 из книги Т.Кайта "Oracle для профессионалов"Хранимые процедуры на языке Java
  • Что такое PostgreSQL?
  • Обновлен PostgreSQL FAQ

    31 марта

  • Использование Веб-сервисов в Caché
  • Защита на уровне строк (Oracle)
  • Секции в реальном мире

    29 марта

  • Разработка успешных приложений для Oracle - первая глава из книги Тома Кайта "Oracle для профессионалов"
  • Web-сервисы: растущие опасения (мнение аналитиков IDC)
  • Технология OLAP - мощная альтернатива электронным таблицам
  • Какой модной стала подготовка отчетности

    24 марта

  • Многоверсионность данных и управление параллельными транзакциями
  • Исключение из правил. Опыт разработки и внедрения финансовой корпоративной системы
  • Обнаружение компрометаций ядра Linux с помощью gdb
  • Корпоративная сервисная шина - "бюджетный" подход к решению задач интеграции
  • Сервис-ориентированная архитектура
  • Бизнес-процессы и XML

    22 марта

  • Доступно. И точка! (обзор точек беспроводного доступа)
  • Коммутаторы Fast/Gigabit Ethernet для "большой" сети
  • Push to Talk: нажми на кнопку и ...говори
  • Сети нового поколения и технология softswitch

    17 марта

  • Часто задаваемые вопросы о proxy (proxy FAQ)
  • Самонастраивающаяся база данных: управляемые приложения и настройка SQL
  • Еще раз о волоконных трассах
  • Настраиваем русский Unicode в FreeBSD-5.3.

    10 марта

  • Еще не сказанное о волоконной оптике
  • Wi-Fi на службе оператора
  • Пора менять платформу?
    (о сокетах LGA775 и PGA478)

    Oracle:

  • Детальный аудит для практических целей
  • Шифруем свои ресурсы данных

    3 марта

  • Требования к проекту. Классификация - первый шаг к пониманию
  • Gtk vs. Qt: драки не будет
  • Управление бизнесом "по максимуму": BPM для финансовых учреждений
  • Реализация решения по управлению эффективностью бизнеса
  • Новые SerialATA-винчестеры
  • Карман для сервера

    1 марта

  • Выбрать корпус - нет ничего проще?
  • Создание виртуальной сети с удаленной загрузкой узлов
  • Текущее состояние и перспективы развития рынка интеграционных технологий
  • Интеграция корпоративной информации: новое направление
  • Архитектурные подходы к консолидации

    24 февраля

  • Каждому проекту своя методология
  • Императив интеграции
  • Безопасность IP-телефонии - полевые зарисовки
  • О злокозненности Билла Гейтса, или почему я не люблю Windows

    22 февраля

  • Oracle10: шифруем данные
  • В версии Oracle10 "виртуальные частные базы данных" данных стали избирательнее
  • Каждому (пользователю) свое (данное в таблице)
    Часть 1
    Часть 2
  • Ускоряем интернет
  • Сетевая аутентификация на практике
  • В фокусе Microsoft Virtual Server 2005

    17 февраля

    Открыт новый раздел
    Все об Open Source

    Все новости >>>



  • IT-консалтинг Software Engineering Программирование Open Source СУБД Безопасность Internet Сети Операционные системы Hardware

    Информация для рекламодателей PR-акции, размещение рекламы - pr@citforum.ru, тел. +7 095 4119920 Пресс-релизы - manager@citforum.ru
    Послать комментарий
    Информация для авторов
    Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
    Copyright © 1997-2000 CIT, © 2001-2004 CIT Forum
    Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...