SQL:
При добавлении нового поля в таблицу, получил неожиданную ошибку MySql: Invalid default value for 'DATE'.
Оказалось, что одно из полей таблицы было задано как `DATE` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' и, скорее всего, из-за смены версии MySql, такая запись стала невалидной.
Решение:
Сначала сменить значение по умолчанию для поля на current_timestamp:
ALTER TABLE `reviews` MODIFY `DATE` datetime NOT NULL DEFAULT current_timestamp
а потом добавить нужное, например:
ALTER TABLE `reviews` ADD `TEST` varchar(255) COLLATE 'utf8_unicode_ci' DEFAULT NULL;
Вовремя использования создания резервной копии БД Сайта, через mysqldump:
mysqldump -hlocalhost -uUSER -p DB > result.sql
Получил ошибку: 'Access denied; you need (at least one of) the PROCESS privilege(s) for this operation' when trying to dump tablespaces
Решение: добавление ключа --no-tablespaces
mysqldump --no-tablespaces -hlocalhost -uUSER -p DB > result.sql
MySql меняем тип поля с vchar на int
Столкнулся с тем, что у одного проекта поле с количеством товара было vchar. И, в один прекрасный момент, в него начали выгружать количество с двумя нулями в конце ",00". Как результат много где отвалились проверки и эти нули вылезли в карточке товара, на главной, в категории... проще сказать где они не вылезли.
Решение кажется простым, просто сменить тип с vchar на int, но MySql не даст это сделать, т.к. не сможет привести типы.
Решение:
Делам копию поля (на всякий пожарный)
Используем функцию REPLACE для удаления ",00"
Меняем тип, теперь это можно сделать.
ALTER TABLE `b_iblock_element_prop_s1` ADD `_TMP` varchar(250) COLLATE 'utf8_unicode_ci' NULL; UPDATE b_iblock_element_prop_s1 SET _TMP = PROPERTY_21; UPDATE b_iblock_element_prop_s1 SET PROPERTY_21 = REPLACE(PROPERTY_21, ',00', ''); ALTER TABLE `b_iblock_element_prop_s1` CHANGE `PROPERTY_21` `PROPERTY_21` int NULL AFTER `PROPERTY_20`;
Пердставляни в MySql (CREATE VIEW)
В MySql, начиная с версии 5, появилась возможность создавать "Представления" (view).
Представления можно назвать "виртуальными сводными таблицами", т.к. представление отображает данные из указанных таблиц и к нему можно делать запрос точно также как и к обычным таблицам.
Если говорить простоям языком, то при создании представления мы указываем из каких таблиц и какие данные брать, т.е. мы помещаем в него всю логику, а дальше вызываем его как обычную таблицу:
CREATE VIEW test_view_01 AS SELECT title FROM blog_category WHERE id_parent = 0;
SELECT * FROM `test_view_01`
Данные в представлении не хранятся, если они будут изменены в таблице, то обновляются и в представлении.
Отдельный момент интересный, представление можно использовать для поддержки легаси. Например, если старое приложение берет данные из какой-то таблицы (которой в новых версиях больше нет) и изменить это нельзя, то можно сделать представление с нужным названием и нужными полями.
Также замечу, что myphpadmin их вполне себе видит:
При попытке сменить пароль root пользователя mysql / mariadb (через mysql_secure_installation / mysql_secure_installation), получил ошибку "ERROR 1146 (42S02) at line 1: Table 'mysql.global_priv' doesn't exist"
Change the root password? [Y/n] Y ERROR 1146 (42S02) at line 1: Table 'mysql.global_priv' doesn't exist
Решение проблемы, запустить
sudo mysql_upgrade
Настройка phpMyAdmin - blowfish_secret
Если, после установки phpMyAdmin, видите сообщение "В конфигурационном файле необходимо задать парольную фразу (blowfish_secret)."
То стоит еще немного его настроить.
При сохранении данных в БД получил ошибку Invalid datetime format: 1366 Incorrect string value, первоначально подул, что проблема с ORM библиотекой, но замена на RedBeanPHP ничего не дала, ошибка появлялась при попытке сохранить в базу HTML страницу.
Учитывая, что объемы текста были довольно большими, то понять, что именно вызывает ошибку было проблематично.
Решение оказалось довольно простым, данные, до сохранения в БД нужно было прогнать через php функцию utf8_encode.
Joomla: MySql #1025 - Ошибка при переименовании (ошибка: 168 "Unknown (generic) error from engine")
При попытке обновить Joomla до 3.10.1 получил предупреждение, что сначала нужно поправить структур БД.
При попытке ее исправить получил ошибку: got error 168 unknown generic error from engine from storage engine
Аналог implode в mysql
Во многих языках программирования есть функция implode, позволяющая преобразовать массив в стоку с разделителем.
В SQL, и в частности в MySql , есть аналогичная возможность:
SELECT GROUP_CONCAT(`id`) AS id_list FROM `products` WHERE 1
Но стоит учесть, что длинна результирующей строки, в MySql, ограничена 1024 символами.
При этом, при если результат буде т длиннее, то ошибки не будет, а строка просто будет обрезана.
Поэтому, стоит сначала изменить максимальную длину:
SET SESSION group_concat_max_len = 1000000;