Работа с базами данных / FAQ по PHP
Оглавление
- При выборке из базы MySQL неправильно сортирует русские буквы.
- Как перейти c MySQL на PostgreSQL?
- Добавляем запись с автоинкрементным уникальным индексом. Как узнать значение последнего индекса?
- Как взять картинку из BLOB?
- Какую базу данных лучше всего выбрать?
При выборке из базы MySQL неправильно сортирует русские буквы.
Если есть возможность, то запустите mysqld с опцией: --default-character-set=cp1251" , если нет, то попробуйте послать MySQL такой запрос: SET CHARACTER SET cp1251_koi8 - это изменит набор символов для текущего соединения. SET CHARACTER SET DEFAULT - установит обычную таблицу символов.
Имейте ввиду, что эта настройка действует только для текущего соединения. Более подробно в RTFM.
Для правильной работы ORDER BY и GROUP BY сервер MySQL должен знать текущий набор символов. К сожалению, версии 3.х и 4.х MySQL могут иметь только _один_ charset на все базы одновременно. Задается в /etc/my.cnf:
[mysqld] default-character-set=koi8_ru
Проверить можно так:
mysql> show variables like 'character_sets' ; mysql> show variables like 'character_set' ;
В этом случае все символьные поля во всех таблицах будут храниться в KOI8-R. Для того, чтобы работали клиенты ODBC из под Windows необходимо, чтобы первым SQL оператором в Windows-приложении была команда:
SET CHARACTER SET cp1251_koi8 ;
Тогда включится перекодировка "на лету". На сервере будет KOI8-R, а на клиенте Windows-1251 и все сортировки будут работать. Эту же команду можно прописать в MyODBC 3.5х "SQL command on connect" (STMT=), она выполнится автоматически.
Другой вариант -- не использовать KOI8-R, а хранить базы в Windows-1251 и сообщить об этом серверу, прописав в /etc/my.cnf:
[mysqld] default-character-set=cp1251
Как перейти c MySQL на PostgreSQL?
Рекомендую http://www.webmasterbase.com/subcats/6 (Migrate your site from MySQL to PostgreSQL - Part 1, Migrate your site from MySQL to PostgreSQL - Part 2) Vova Rusakevich, 2:454/23.501
Добавляем запись с автоинкрементным уникальным индексом. Как узнать значение последнего индекса?
Для MySQL
Есть замечательная функция mysql_insert_id ([идент. соединения]).
Возвращает целое значение, которое и есть необходимый идентификатор, сгенерированный полем AUTO_INCREMENT в последем операторе INSERT.
Подробно см. в доках по функциям PHP.
Следует обратить внимание на то, что mysql_insert_id получает число типа INT, поэтому необходимо быть осторожным при использовании этой функции с полями типа BIGINT.
Для MSSQL
Нужно сразу после insert выполнить запрос 'select @@IDENTITY newID from Твоя_Таблица'. Получишь идентификатор для только что вставленной записи.
Подробнее о переменных см. в доках MS SQL.
Как взять картинку из BLOB?
Для MSSQL
Просто использовать функции mssql_* не получится, но можно использовать odbc_*
Для ODBC
Должен быть создан так называемый System DSN в ODBC Admin
Вызов: getfoto.php?id=13
<? $sql = odbc_connect("namedsn", "user", "password") or die('die message'); $query = odbc_exec($sql, "select FOTOFIELD from FOTOTABLE where ID=$id"); if ($fetched = odbc_fetch_row($query)) { $dbimage = odbc_result($query, "FOTO"); } else { $filename = "./none.jpg"; // Пустая картинка $fd = fopen ($filename, "rb"); $dbimage = fread ($fd, filesize ($filename)); fclose ($fd); } header('Content-type: image/jpeg'); //header('Content-Disposition: attachment; filename='.$id.'.jpg'); print $dbimage; flush(); odbc_close($sql); ?>
Какую базу данных лучше всего выбрать?
Выбор базы данных (SQL-сервера) зависит от задач, которые планируются.