Ответы пользователя по тегу MySQL
  • Влияет ли различные кодировки таблиц на производительность MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Нет, не влияет.
    Если хотите чтобы у вас нормально сохранялись тексты, а не рубились на половине, используйте utf8mb4
    про utf8 давно пора забыть
    Ответ написан
    Комментировать
  • Экранирование sql запросов, достаточно ли функции?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Эта функция не самописная, а цельнотянутая. Причем из самых смрадных помоек интернета.
    К защите от инъекций не имеет вообще никакого отношения.

    - trim() ни к инъекциям, ни к защите отношения не имеет
    - stripslashes() просто бессмысленная функция, которая только портит данные
    - htmlspecialchars() не имеет отношения к SQL. Применяется при выводе данных, а не при получении
    - real_escape_string() - единственная функция, которая имеет отношение к SQL, но при этом вообще не предназначенная ни для каких защит.

    Попробуйте на основании этой информации самостоятельно оценить полезность вашей функции.

    Возьмем классический пример
    $_GET['id'] = '1;DROP TABLE Students;';
    $id = formatstr($_GET['id']);
    $sql = "SELECT * FRPM Students WHERE id=$id";

    И посмотрим, помогло ли ваше самописное экранирование предотвратить хоть что-то (спойлер: нет).
    (да, та функция, которую лично вы используете для выполнения запросов, выполняет только один запрос за раз. И вместо инъекции вы получите ошибку. Но это не отменяет сам факт получения инъекции.)

    Как правильно все отметили выше, для защиты от инъекций используются подготовленные запросы, в которых все переменные заменяются на специальные маркеры, и передаются отдельно.
    Ответ написан
    2 комментария
  • Как исправить кракозябры вместо кириллических символов при записи переменной в сессию?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    При соединении с БД надо указывать кодировку.
    Поскольку на сайте используется юникод, то соответственно указывать надо utf8mb4

    А сессии тут вообще не при чем.
    Ответ написан
    1 комментарий
  • Почему не записываются данные в БД, UPDATE не работает?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если данные не обновляются в БД, то на это может быть три причины
    1. Код добавления вообще не вызывался.
    2. При добавлении произошла ошибка.
    3. Данные добавились, в одну базу, а результат смотрим в другой.

    Первый пункт должен проверить сам программист, никакой дядя с хабра за него это не сделает.
    Второй в случае Ларавля отпадает, там, в отличие от самопальных поделок горе-программистов, с отображением ошибок все хорошо.
    Остается только третий.
    Ответ написан
    Комментировать
  • Как исправить кракозябры вместо кириллических символов?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    У вас в этой таблице лежат данные, закодированные в windows-1251.
    Вам надо или перекодировать полученные данные нормально, через mb_convert_encoding(), а не вот это вот недоразумение utf8_encode.

    Или лучше всего один раз и навсегда перекодировать данные в БД.
    Для этого надо сделать дамп, поменять в нем set names с utf8 на cp1251, и выполнить сначала на тестовой БД
    Если данные будут читаться, то выполнить на боевой.
    Ответ написан
    1 комментарий
  • Что делать если хост отвергает подключение к mysql из вне?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Надо погуглить ошибку.
    И прочесть, что для использования сервиса удаленными компьютерами надо разрешить входящие соединения к этому сервису на файрволле.
    Ответ написан
    Комментировать
  • MysqlDump в разные файлы разные базы данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Не очень понятно, что имеется в виду под "скриптом", но однострочник на баше написать можно.
    Собственно, задача стандартная, и решение легко находится гуглем, если владеть языком международного общения.
    mysql -uroot -N -e 'show databases' | while read db; do mysqldump -uroot "$db" > "$db".sql; done

    spoiler
    Если вдуматься, то интернет - это самое непроизводительное использование ресурсов в человеческой истории.
    Ответы на 99% вопросов уже лет 20 как лежат на расстоянии вытянутой руки.
    но их задают снова и снова
    Ответ написан
    4 комментария
  • Почему не выводит ошибку при работе с базой после переноса на сервер?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Комментировать
  • Не добавляются данные в таблицу phpmyadmin?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если после добавления данные не видны в программе phpmyadmin, то на это может быть три причины:
    1. Код добавления вообще не вызывался.
    2. При добавлении произошла ошибка.
    3. Данные добавились, в одну базу, а результат смотрим в другой.

    Причем все три пункта проверить может только сам программист, никакой дядя с форума за него это не сделает.
    Дядя с форума может помочь только со вторым пунктом. Рассказав, как отслеживать ошибки правильно. Например, добавив в код следующие строчки:

    <?php
    # Настройка ошибок
    # Для локального сервера
    ini_set('display_errors', 1);
    # Всегда
    error_reporting(E_ALL);
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);


    Ну и чтобы заранее избежать самых тупых ошибок, запросы должны быть подготовленными.
    Ответ написан
    Комментировать
  • Почему Mysql на виртуалке не грузиться после перезагрузки?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    The manual page at dev.mysql.com/doc/mysql/en/crashing.html contains
    information that should help you find out what is causing the crash.
    Ответ написан
  • Как увеличить скорость добавления данных в базу данных mysql?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы решить проблему, её надо сначала сформулировать.
    В данном случае никакой проблемы нет, есть невнятные страдания.
    Ни кода, ни внятного описания проблемы, ни даже пояснения, что имеется в виду под "добавлением" в вопросе нет.

    В простейшем случае либо делать один множественный запрос insert, либо заключить отдельные запросы insert в транзакцию
    Ответ написан
    6 комментариев
  • Как правильно соединить при выдаче 2-3+ разных таблиц с одинаковой структурой в единую выборку?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Сделать вместо этого зоопарка ОДНУ таблицу.
    Ответ написан
    2 комментария
  • Что можно подкрутить в mysql?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вам же пишут, с двумя восклицательными знаками: InnoDB buffer pool / data size: 128.0M/5.1G
    128 метров - это значение по умолчанию. А должно быть 90% памяти, выделенного для БД
    И этой памяти должно хватать для всех индексов

    Собственно, вот же оно написано вам прямым текстом:
    Variables to adjust:
        join_buffer_size (> 256.0K, or always use indexes with JOINs)
        performance_schema = ON enable PFS
        innodb_buffer_pool_size (>= 5.1G) if possible.
        innodb_log_file_size should be (=16M) if possible, so InnoDB total log files size equals to 25% of buffer pool size.


    Только если памяти действительно 4 гига, то не надо делать 5.1. 3.5 будет достаточно
    Ответ написан
    5 комментариев
  • Что лучше сейчас использовать?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Вообще-то ПМА - это самый отстойный клиент для работы с БД
    Я не понимаю, как люди вообще им могут пользоваться.

    Берете любой локальный клиент (в идеале PHPStorm, но можно хоть Workbench) и настраиваете доступ к удалённой БД серез SSH.

    Вот только NGINX тут совершенно не при чем. К базам данных эта программа не имеет ни малейшего отношения
    Ответ написан
    Комментировать
  • Почему выскакивает эта ошибка при INSERT INTO?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Потому что одинарные кавычки имеют в программировании определенный смысл, и их надо писать только там, где надо, а не просто добавлять от балды в код?
    Ответ написан
    8 комментариев
  • Как перенести данные из нескольких таблиц в одну?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    insert into odna (col1, col2) select col1, col2 from drugaya;
    insert into odna (col1, col2) select col1, col2 from tretya;
    Ответ написан
    Комментировать
  • Как узнать наличие записи в базе данных и получить нужные значения?

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Весь код у вас уже есть.
    Вам только надо самому решить, чего вы хотите - проверить наличие записей, или выполнить дальнейшие действия.

    Код у вас - для второго.
    А пытаетесь вы его использовать для первого.

    Чтобы проверить, цикл не нужен. Чтобы обработать - КАК вы обойдетесь без цикла?

    В принципе, я тут не вижу нужды проверять. Просто запросить, да обработать.
    Но если прям жить не можете без проверки, то можно например использовать переменную
    $found = false;
    foreach($result as $row){
        $found = true;
        $orderId = $row["orderId"];
        // делаете что хотите
    }
    if(!$found) {
        print 'нет';
    }


    Если запись может быть только одна, то еще проще

    $result = mysqli_query($mysqli, "SELECT * FROM `Order` WHERE status='NEW'");
    $row = $result->fetch_assoc();
    if ($row) {
        $orderId = $row["orderId"];
    } else {
        print 'нет';
    }
    Ответ написан
  • Что означает длина поля int?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Размер, указываемый для поля типа int, не влияет на значения. И - как следствие - не влияет и на занимаемую память. Непонятно, с чего вы решили обратное.
    Если поле типа int(1) позволяет сохранить значение 4294967295, то естественно, что и памяти оно будет занимать те же 4 байта, что и int(10)

    Цифра эта ни на что не влияет, и имеет скорее декоративное значение.
    Если хотите сократить память/предельное значение, то используйте другой тип поля -
    TINYINT занимает 1 байт, до 255
    SMALLINT занимает 2 байта, до 65535
    MEDIUMINT - 3 байта, до 16777215
    Ответ написан
    1 комментарий
  • Как сформировать запрос?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    У меня получилось как-то так
    select sum(o.sum), sum(fsum) from orders o left join 
    (select order_id, sum(price) fsum from foodcost where order_id in (1,2) group by order_id) t
    on o.id=t.order_id 
    where o.id in (1,2);

    То есть группировать продукты перед джойном.
    Ответ написан
    Комментировать
  • Можно ли индексировать varchar в mysql?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Можно
    Ответ написан
    Комментировать