Porady & Profesjonalne strony internetowe / usługi www

unknown collation ‘utf8mb4_unicode_520_ci’ – jak radzić sobie z błędem sql

Błąd, z którym mogliście się nie raz spotkać przy migracji lub przenoszeniu projektu na drugi serwer - niezależnie od CMSa(choć najczęściej w WordPressie), zawartości bazy danych, czy sposobu importu. Jest to oczywiście problem, który jak najbardziej da się rozwiązać, jeśli odpowiednio do niego podejść.

Geneza problemu

Błąd najczęściej pojawia się w trakcie importu bazy danych na serwer MySQL o wersji mniejszej, niż 5.5.3 - zestaw znaków utf8mb4 został wprowadzony właśnie w tej wersji MySQL i jeśli serwer, na którym dokonujesz importu posiada wersję mniejszą, to najprawdopodobniej pojawi się właśnie taki błąd.

Generalnie jeśli jest to "wasz" hosting, to powinniście zmienić usługodawce lub poprosić go o aktualizację wersji serwera MySQL jeśli jest taka możliwość(bardzo rzadko sami mamy taką możliwość poprzez konsolę SSH) - używanie starych wersji oprogramowania nigdy nie jest bezpieczne. Często jednak trafia się to w przypadku przenoszenia projektu na serwer klienta, gdzie nie mamy wielkiego wyboru...

Solucje

Pierwsza, to eksport bazy danych w zgodności z MySQL 40

1. Logujemy się do panelu phpmyadmin.
2. Zaznaczamy interesującą nas bazę danych.
3. Wybieramy zakładkę "eksport".
4. Metodę eksportu wybieramy na "dostosuj":
metoda eksportu bazy sql
5. Następnie wybieramy z opcji "System bazy danych lub starszego serwera MySQL w celu maksymalizacji zgodności produkcji z" MYSQL40:
maksymalizacja zgodności wersji bazy mysql
6. Tak wyeksportowaną bazę importujemy normalnie na serwerze docelowym.

Czy jest to dobry sposób
? Niekoniecznie.

W wielu przypadkach oznacza to częściową utratę danych - często są to dane kluczowe, przez co tworzy się niepotrzebny chaos, na którego ogarnięcie niepotrzebnie tracimy czas.

Najczęściej problem może się pojawić właśnie przy WordPressie - jeśli używamy jakichkolwiek znaków, które nie są wspierane przez wersję serwera mysql, to będziemy mieli "straty" - objawia się to naprawdę w przeróżne sposoby i naprawianie tych błędów nie jest warte ani czasu, ani nerwów - uwierzcie mi.

Dlaczego więc podałem go? Jest to metoda, którą najczęściej znajdziecie w przypadku odpowiedzi na Stack Overflow i tutaj macie wyjaśnione ją w prosty sposób. Po drugie, w niektórych(nie-wordpressowych) przypadkach w zupełności wystarczy.


Drugi sposób, to całkowita konwersja do UTF8

Nie jest to sposób, który należy do nieinwazyjnych ale daje nam największą szansę na to, że nie utracimy żadnych danych przy migracji.

1. Kopiujemy poniższy kod:

<!DOCTYPE html>
<html>
<head>
  <title>DB-Convert</title>

<style>
    body { font-family:"Courier New", Courier, monospace;" }
  </style>
</head>
<body>

<h1>Convert your Database to utf8_general_ci!</h1>
<form action="db-convert.php" method="post">
  dbname: <input type="text" name="dbname">
  dbuser: <input type="text" name="dbuser">
  dbpass: <input type="text" name="dbpassword">
  <input type="submit">
</form>
</body>
</html>
<?php
if ($_POST) {
  $dbname = $_POST['dbname'];
  $dbuser = $_POST['dbuser'];
  $dbpassword = $_POST['dbpassword'];

  $con = mysql_connect('localhost',$dbuser,$dbpassword);
  if(!$con) { echo "Nie mozna polaczyc sie z baza ";die();}
  mysql_select_db($dbname);
  $result=mysql_query('show tables');
  while($tables = mysql_fetch_array($result)) {
          foreach ($tables as $key => $value) {
           mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
     }}
  echo "<script>alert('Operacja wykonana prawidlowo!');</script>";
}

?>

2. Zapisujemy całość do pliku o nazwie db-convert.php(ewentualnie możecie pobrać gotowy plik tutaj)
3. Jeśli trzeba, to w linii 28 podmieniamy localhost na nazwę naszego serwera mysql.
4. Kopiujemy plik na nasz serwer(najlepiej w oddzielnym katalogu).
5. Uruchamiamy go(poprzez przejście na odpowiedni adres - np. http://mojastrona.pl/katalog/db-convert.php)
6. Pojawi się formularz do wypełnienia danych:
konwersja bazy danych

Dane do wpisania po kolei oznaczają:
dbname: nazwa bazy danych
dbuser: użytkownik bazy danych
dbpass: hasło użytkownika bazy danych

7. Po wypełnieniu danych wciskamy "prześlij".

Operacja w zależności od wielkości bazy może chwilę potrwać. Na koniec powinniśmy dostać monit o prawidłowej konwersji.

Taką przekonwertowaną bazę możemy śmiało eksportować/importować bez dodatkowych reguł.


To by było na tyle. Pamiętajcie, żeby przed jakimikolwiek operacjami wykonać zawsze kopię zapasową oryginalnej bazy danych.


Źródła:
stackoverflow.com/questions/29916610/
wordpress.org/support/topic/unknown-collation-utf8mb4_unicode_ci/