Показаны сообщения с ярлыком mysql. Показать все сообщения
Показаны сообщения с ярлыком mysql. Показать все сообщения

среда, 6 апреля 2016 г.

Режим mysql 5.6/5.7, после обновления с 5.5 (sql-mode)

На сервере стоял mysql 5.5 (Debian 8), но в этой версии есть ограничение на дефолтные значения TIMESTAMP, оно было снято в mysql 5.6.5

В 5.5 выдавало ошибку:
Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

А вот выдержка из документации
Changes in MySQL 5.6.5 (2012-04-10, Milestone 8)

Previously, at most one TIMESTAMP column per table could be automatically initialized or updated to the current date and time. This restriction has been lifted. Any TIMESTAMP column definition can have any combination of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses. In addition, these clauses now can be used with DATETIME column definitions. For more information, see Automatic Initialization and Updating for TIMESTAMP and DATETIME.

 Если уж обновлять mysql, то сразу до 5.7, но на хостинге много стареньких сайтиков, перепиливать их все не хотелось, к тому же проблему нужно было решить прямо сейчас, после обновления до 5.6/5.7, mysql более строго относится к вводимым данным, например нельзя добавить запись без указания значения того поля, где не задано значение по умолчанию:
Field XXX doesn't have a default value

А еще нельзя передать пустую строку в поля, где тип float/integer:
Incorrect integer value ” for column XXX at row M



Для того, чтобы mysql молча съедал все эти запросы и корректно работали сайты - нужно прописать в my.ini в секцию [mysqld]:
sql-mode=""


Но на DEV-сервере лучше оттачивать движок без таких параметров, чтобы сразу видеть все недочеты базы и работы с ней. 

четверг, 14 мая 2015 г.

Mysql и работа с NULL

Сегодня столкнулся с такой тонкостью, допустим в одном из полей есть значения числовые, 0 и NULL (при постепенной доработке движка и базы так получилось)



 мы делаем запрос

SELECT * FROM `products` WHERE NOT `picture_id`>0

У нас выберет записи, у которых в picture_id 0, но не выберет те, у которых NULL


А теперь чуток поменяем запрос и получаем вот что:

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

Для решения данной проблемы нужно писать
SELECT * FROM `products` WHERE `picture_id`=0 OR `picture_id` IS NULL

Либо значение по умолчанию поставить 0, а потом выполнить запрос
UPDATE `products` SET `picture_id`=0 WHERE `picture_id` IS NULL

среда, 17 декабря 2014 г.

Apache+MySQL+PHP на MacOS 10.10 Yosemite (LAMP/MAMP)

Помните я выкладывал скрипт для поднятия веб-хостинга на MacOS 10.9?
Сегодня я его немного дописал и адаптировал под Yosemite.

https://github.com/PavelApostol/macscripts/blob/master/lamp-on-mac10.10.sh

Всё что нужно сделать - сохранить себе на комп, сделать файл исполняемым и запустить от суперпользователя или выполнить три команды:
sudo su
curl -L https://raw.githubusercontent.com/PavelApostol/macscripts/master/lamp-on-mac10.10.sh |sh


После выполнения этих  команд на вашем компе будет запущенный Apache и Mysql, сконфигурированый PHP и установленный phpmyadmin.

Лимит аплоада в PHP увеличен до 900 мегабайт, потребление оперативной памяти сервером mysql уменьшено с 423 до 72 мегабайт, что актуально на портативных машинках с 4 гигами памяти.

Идея на этом не завершается, чтобы получить некое подобие денвера и разворачивать виртуалхосты автоматически - создан скриптик webhost_sync.sh
https://github.com/PavelApostol/macscripts/blob/master/webhost_sync.sh

Вы создаете папку site1 в папке /www, запускаете скриптик и автоматически добавляется виртуалхост site1.loc, помимо этого он еще и прописывается в /etc/hosts, префикс .loc можно легко поменять например на .mydev777.ru




Если будут вопросы - пишите в Gtalk: pavelbbb@gmail.com



вторник, 9 октября 2012 г.

Убрать повторяющиеся товары оставив дешевые

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

Есть таблица products, в ней поля name(название товара),  model(модель),
price(цена).

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

Нам нужно отсортировать товары по моделям, далее по цене (одинаковые модели), потом сгруппировать по модели, чтобы исключить повторы (останутся самые первые товары в группах), но вот в чем косяк - в mysql order должен идти после group, что нам не подходит, для решения проблемы делаем вот так



SELECT * FROM

(
   SELECT name,model,price
   FROM `products`
   ORDER BY model,price
) as tmp


GROUP BY model