рейтинг
2 голос
сила
2.06

MySQL →  Oracle купила Sun Microsystems

Американская Oracle, третья по величине софтверная компания в мире, приобретет компанию Sun Microsystems за 5,6 миллиарда долларов, сообщили корпорации в официальном совместном пресс-релизе. С учетом долга и свободной наличности Sun Microsystems сумма сделки составит 7,4 миллиарда долларов

Вот интересно получается. В свете того что Sun купил MySQL а Oracle купил Sun — теперь при установке MySQL будем любоваться значком Oracle=)
1

PHP программирование →  Как работает rand?

Столкнулся с задачкой генерации логинов. Недолго думая была написана такая функция:


private function _get_login() {
       
        $login = "";                           
        for( $i=0; $i<=9; $i++ ) {

                $login .= chr( rand( 97, 122 ) );
        }
        return $login;
}
 


Которая по моему скромному мнению должна была генерировать уникальные логины, которые живому человеку придумать тяжело. Упор ставился именно на уникальность.
Если посчитать, количество таких логинов примерно 141167095653376. Логины генерировались и вставлялись в БД. Каково же было моё удивление когда после генерации примерно 1000 логинов посыпались ошибки добавления в базу при срабатывании констрейнтов не уникальности данных. Причем ошибки не единичные, а десятки логинов подряд вылетали. Начал исследовать — выяснилось эта функция действительно генерирует повторяющиеся логины=\. Как такое может быть, что бы последовательности из 10 случайных чисел совпадали так часто? Ответа на этот вопрос так и не нашел. Перешел на использование функции mt_rand(), которая работает в 4 раза быстрее обычной rand(), имеет какие-то известные гарантированные характеристики работы(в отличии от rand()) и добавил элементарную проверку.
Получилось так:


private function _get_login() {
       
       
        $done = false;
        while( !$done ) {
               
                $login = "";                           
                for( $i=0; $i<=9; $i++ ) {

                        $login .= chr( mt_rand( 97, 122 ) );
                }
                $sql = "SELECT count(*) FROM users WHERE login='$login'";
                if($this->db->fetchRow( $sql ) == 0)
                        $done = true;
        }
       
        return $login;
}
 


Может у вас будут идеи по усовершенствованию алгоритма генерации логинов что бы они удовлетворяли следующим условиям:
-более-менее удобочитаемы, а не что-то невнятное вида qlgkakxwci
-более-менее уникальные — что-то типа qlgkakxwci =)

Спасибо за внимание.
1

Мой софт →  Чем я пользуюсь в поведневной жизни

ОС: XP
Любимый редактор: Notepad++
Любимый браузер: Mozilla Firefox
ICQ клиент: QIP
Еще мессенджеры:
Слушайю музыку в: Winamp, IPod
Пользуюсь почтой: Gmail
Почтовый клиент: Web-interface, Microsoft Outlook
Для работы с файлами: Total Commander — Univercity of Amsterdam
Редактирую документы в: Notepad++, Winword
Любимый антивирус: NOD32
Version Control System: ClearCase
Я рекомендую: Notepad++
1

MySQL →  Немного о NULL-ах

Наверняка все знают о таком понятии в SQL как NULL.

NULL — это не 0, это не 1, это не пустая строка. NULL обозначает что на данный момент неизвестно какое значение хранится в базе данных.

Теперь маленькое исследование.

1. Что будет результатом логической операции

FALSE OR NULL


Поскольку неизвестно, чем именно является NULL — TRUE или FALSE, результат запроса тоже неизвестный, поэтому результат этой операции — NULL

2. Что будет результатом логической операции

TRUE OR NULL


Поскольку один из операндов логической операции — TRUE, то независимо от значения второго операнда результат операции будет TRUE. MySQL следует этой логике и выдает результат — TRUE

3. Что будет в результате арифмитической операции

0*NULL


Можно было бы легко следовать логике, аналогичной второму вопросу и прийти к тому что в результате будет 0. Но как показала практика у MySQL на этот счет своя логика. Результат этой операции будет NULL.

Вот такая арифметика.
2

Блог им. qubit →  Оптимизируем нагрузку на сервер

В общем есть такая небольшая задачка.

Есть каталог /img, в котором несколько тысячь картинок. Нужно оптимизировать
размещение рисунков, так чтобы поиск каждой картинки (на диске) занимал
минимальное количество системных ресурсов компьютера, на котором
располагается сайт.

Вариант решения:

У нас есть 12000 картинок. Копируем эти картинки и копии
переименовываем в порядковой нумерации. Получим файлы с названием
000000.jpg, 000001.jpg...012000.jpg.

Каждый файл помещаем в директорию, соответствующую его названию. Для
файла 011535.jpg будет создана структура папок 0/1/1/5/35.jpg. При
этом в базе нужно ввести новое поле, в котором будет храниться новое
положение файлов. Потом переписать темплейты с учетом нового пути.
После этого можно удалять старые файлы и ненужные поля в базе.
Таким образом в каждой из директорий будет находиться максимум 100
файлов что ускорит поиск нужной картинки.

возражения/пожелания/благодарности готов обсудить в комментах=)
1

Говнокод →  Ищем ошибки в sql запросе

К сожалению и к моему большому удивлению в Оракле нет такого полезного оператора LIMIT, который есть в MySQL. Аналогом ему в оракле служит псевдо-колонка rownum, которая отображает номер выбираемой записи по ходу выборки.

Итак, есть такой вот простенький sql запрос для Oracle

SELECT * FROM T WHERE ROWNUM BETWEEN 2 AND 20


который по мнению автора выберет 19 строк, начиная с 2 и заканчивая 20-й.
Вопрос знатокам: Будет ли такой вопрос выводить требуемые записи? Вроде как будет… Но раз этот пост в разделе говнокод, то надо подумать ещё.

Думаем. Когда у нас выберется первая запись по нашему запросу? Когда rownum будет 2. А когда rownum будет 2? После того как выберется первая запись. Из всего этого делаем однозначный вывод — не выберется ни одной записи.
1

MySQL →  Обрезаем строку в юникоде

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

В PHP4 есть такая замечательная функция substr
string substr  ( string $string  , int $start  [, int $length  ] )

substr() возвращает подстроку строки string длиной length, начинающегося с start символа по счету.
Вся проблема в том что для кодировки unicode эта фунция работает некорректно.
                                    

Эту проблему я решил с помощью mysql. Поскольку данные хранятся в базе, логично было бы делать выборку и возвращать уже обрезанные данные. К тому же это будет значительно производительнее, чем выполнять эту операцию средствами php.

В MySQL есть такая же функция SUBSTR которая прекрасно работает со всеми кодировками. Единственный подводный камень — в MySQL строка начинается не с 0 как в php а с 1. Если вы вторым параметром укажите 0 то в результате получите пустую строку.

SELECT SUBSTR(username, 1, 20) username, SUBSTR(comment, 1, 20) comment FROM comments


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

Для этого используем конструкцию IF из синтаксиса MySQL. Если строка до обрезания не равна строке после обрезания то нужно добавить '...' к этому комментарию. Получим вот такой запрос:
SELECT uniq_id, IF(SUBSTR(username, 1, 20)=username, username, CONCAT(SUBSTR(username, 1, 20), '...')) username, IF(SUBSTR(comment, 1, 20)=comment, comment, CONCAT(SUBSTR(comment, 1, 20), '...')) comment FROM comments


В результате получаем как раз то что нам нужно:



Потом просто выводим уже готовые username и comment в нужном нам месте на странице.
2

MySQL →  У Джинса кончилось место на диске

Сегодня на одном из моих сайтов вылезла интересная ошибка mysql. Начал разбираться в чем дело — запросы никто не менял и на ровном месте появилась ошибка.
MySQL Error #1030: Got error 28 from storage engine

Ошибка оказалась в таком запросе:
SELECT * FROM mov ORDER BY RAND() LIMIT 5

Кто не в курсе — выбор случайных 5 записей из таблички(а вы как выбираете?)
Причем запрос
SELECT * FROM mov LIMIT 5
выполняется на ура.
В чем же проблема? Погуглил и оказалось что что эта ошибка вылазит когда кончается место на диске. Освободил место и… О чудо! Все заработало.

P.S. Только что захожу на сайт мобильного оператора Jeans и вижу что не у одного меня такие проблемы=):
1

Блог им. qubit →  Реклама для задротов Oracle

На сайте http://ora-code.com/ крутится интересная реклама для реальных гурманов Oracle.

1

Говнокод →  Говнокод в Миранде

Вот такая вот реализация функции получения длины номерка UIN в Миранде.

\miranda\miranda\protocols\IcqOscarJ\icq_packet.c, line 206

int __fastcall getUINLen(DWORD dwUin)
{ // TODO: invent something more clever
  if (dwUin >= 1000000000) return 10;
  if (dwUin >= 100000000) return 9;
  if (dwUin >= 10000000) return 8;
  if (dwUin >= 1000000) return 7;
  if (dwUin >= 100000) return 6;
  if (dwUin >= 10000) return 5;
  if (dwUin >= 1000) return 4;
  if (dwUin >= 100) return 3;
  if (dwUin >= 10) return 2;
  return 1;
}


А как бы вы реализовали такую функцию?
2
←  сюда    туда  →
1 2