Întâmpin o problemă legată de MySQL Strict Mode, se poate dezactiva Strict Mode pentru contul meu?

Problema întâmpinată se datorează upgrade-ului versiunii a serverului de baze de date, MariaDB (compatibil MySQL).

Anterior acestei schimbări, versiunea de MariaDB folosită era 10.0, care a ajuns la "End of Life", și nu mai beneficia de actualizări de securitate din partea producătorului.

Versiunea curentă este MariaDB 10.3 (compatibilitate cu MySQL 5.7). 

Față de versiunea anterioară, MariaDB 10.3 vine cu următoarele schimbări majore:

  • Utilizatorii de MySQL ce folosesc parole de tip vechi (înainte de MySQL 4.1), nu se vor mai putea conecta, datorită unor diferențe în algoritmul de stocare al parolelor.
  • Strict Mode este activat implicit, la nivel GLOBAL - acest mod va cauza erori sau avertismente la interogările de tip UPDATE sau INSERT dacă, de exemplu, tipul de date pentru o coloană este incorect. Mai multe informații puteți găsi în documentația MySQL

Rezolvări, în funcție de natura problemei întâmpinate:

  • Dacă primiți o eroare precum parola este invalidă pentru aplicatia pe care o folosiți, vă rugăm să actualizați parola utilizatorului MySQL folosit pentru aplicație. Puteți face acest lucru în contul dumneavoastră cPanel, la secțiunea MySQL. 
  • Dacă primiți erori la INSERAREA sau ACTULIZAREA rândurilor din baza de date, vă rugam să vă asigurați că rulați cea mai noua versiune a platformei folosite (ex: Wordpress, Joomla, Drupal etc.), sau dacă aplicația este realizată "in-house", vă rugăm să luați legătura cu dezvoltatorul acesteia.

Variabila sql_mode poate fi setată la execuția aplicației. Un exemplu de cod PHP:

<?php

$sqlu    = '-';
$sqlp    = '-';

$db = new mysqli('localhost', $sqlu, $sqlp);

if ( $db->connect_error) {
  die("Failed: {$db->connect_error}");
}

$data = $db->query('SELECT @@SESSION.sql_mode');

if ( $data->num_rows ) {
  $row = $data->fetch_row();
  print("Default sql_mode: {$row[0]}" . PHP_EOL);
}

$data->close();

try {
  print(PHP_EOL . "Setting sql_mode to `NO_ENGINE_SUBSTITUTION`..." . PHP_EOL);
  $db->query('SET @@SESSION.sql_mode=NO_ENGINE_SUBSTITUTION');
}  catch (Exception $e) {
  print("Error: {$e->getMessage()}" . PHP_EOL);
}

$data = $db->query('SELECT @@SESSION.sql_mode');

if ( $data->num_rows ) {
  $row = $data->fetch_row();
  print("Current sql_mode: {$row[0]}" . PHP_EOL);
}

$data->close();

La rularea acestuia, va afișa:

Default sql_mode: STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Setting sql_mode to `NO_ENGINE_SUBSTITUTION`...
Current sql_mode: NO_ENGINE_SUBSTITUTION

Alte întrebări:

Nu se poate reveni la versiunea anterioara?

  • Pachetele de "Găzduire Web" folosesc servere de tip shared, care găzduiesc multiple site-uri/utilizatori. Nu putem să ne întoarcem la versiunea anterioară fără a compromite securitatea tuturor utilizatorilor de pe platformă.

Nu se poate dezactiva STRICT_TRANS_TABLES?

  • Această setare este implicită pe versiunile noi de MySQL/MariaDB, și dezactivarea ei este considerată o practică "proastă". Este o setare care nu poate fi controlată la nivel de utilizator. Totuși, puteți încerca configurarea aplicației pentru a seta această opțiune la nivel de tranzacție/sesiune, coform exemplului de cod de mai sus.

De ce această schimbare?

  • STRICT_TRANS_TABLES a apărut în MySQL 5.0 (lansat în 2005). Acest mod de operare este implicit începând cu MySQL 5.6 (lansat în 2013)
  • MariaDB 10.3 a fost lansat pe data de 16 Apr 2018 și a fost urmat de multiple actualizări. Consideram ca un ciclu de actualizare de 2.5 ani (29 de Luni) este suficient ca toate aplicațiile folosite să fie actualizate.
  • Riscurile de securitate în folosirea aplicațiilor învechite este foarte mare, Chroot ține pasul cu tehnologia și va actualiza periodic aplicațiile sale interne cât și serviciile oferite către clienți.

Chroot nu va oferi suport tehnic pentru această problemă. Ea apare în general la aplicațiile învechite care nu au reușit să țină pasul cu noile tehnologii și nu au fost actualizate.


 Tipărire

V-ar mai putea interesa și