# 1273 - Nieznane sortowanie: 'utf8mb4_unicode_ci' cPanel

183

Mam bazę danych WordPress na moim komputerze lokalnym, którą chcę przenieść do hostowanego phpMyAdmin na cPanel. Jednak gdy próbuję zaimportować bazę danych do środowiska, ciągle pojawia się ten błąd:

#1273 - Unknown collation: 'utf8mb4_unicode_ci' 

Próbowałem już wyszukiwać w Google i jedynym rozwiązaniem, jakie mogę znaleźć, jest ten jeden błąd phpmysql - # 1273 - # 1273 - Nieznane sortowanie: „utf8mb4_general_ci”, które jak na razie nie jest zbyt pomocne. Próbowałem usunąć pliki cookie, ale nadal nie działa. Proszę pomóż!

Wairimu Murigi
źródło
Jaka wersja WordPress? Zobacz make.wordpress.org/core/2015/04/02/the-utf8mb4-upgrade
Rick James

Odpowiedzi:

107

Miałem ten sam problem, ponieważ wszystkie nasze serwery obsługują starsze wersje MySQL. Można to rozwiązać, uruchamiając skrypt PHP. Zapisz ten kod w pliku i uruchom go, wprowadzając nazwę bazy danych, użytkownika i hasło, a zmieni to sortowanie z utf8mb4/utf8mb4_unicode_cinautf8/utf8_general_ci

<!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"><br>
  dbuser: <input type="text" name="dbuser"><br>
  dbpass: <input type="text" name="dbpassword"><br>
  <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 "Cannot connect to the database ";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('The collation of your database has been successfully changed!');</script>";
}

?>
Stephen
źródło
47
To wydaje się jak przesada w porównaniu domysqldump --compatible=mysql4
icc97
2
Dla mnie to zadziałało. Pamiętaj, aby nazwać plikdb-convert.php
Fred K
1
Jeśli uczynisz „localhost” wejściem, będzie ono idealne.
br4nnigan
2
mysqldump --compatible=mysql4lub odpowiedź poniżej jest lepszą opcją. Nie sądzę, aby rozsądnym pomysłem było zmienić coś takiego na stronie na żywo. Lepiej wyeksportować w odpowiednim formacie lub, jeśli nie ma takiej opcji, wyeksportuj wyeksportowany plik.
Tisch
Właśnie uratowałeś mi życie, a wszystko, co mogę ci dać, to +1.
Taruc
229

Technika w tym poście działała dla mnie

1) Kliknij kartę „Eksportuj” dla bazy danych

2) Kliknij przycisk opcji „Niestandardowy”

3) Przejdź do sekcji zatytułowanej „Opcje specyficzne dla formatu” i zmień menu rozwijane „System bazy danych lub starszy serwer MySQL, aby zmaksymalizować kompatybilność danych wyjściowych z:” z BRAK na MYSQL40.

4) Przewiń w dół i kliknij „GO”.

Nie jestem pewien, czy to spowoduje utratę danych, jednak za jednym razem, gdy tego spróbowałem, nie zauważyłem żadnej. Ani nikt, kto odpowiedział na forach powiązanych z powyższym.

Edytuj 8/12/16 - Wierzę, że eksportowanie bazy danych w ten sposób powoduje utratę danych zapisanych w widżetach Black Studio TinyMCE Visual Editor , chociaż nie przeprowadziłem wielu testów w celu potwierdzenia.

Evster
źródło
nie działało dla mnie, mam błąd # 1231 - Zmienna „character_set_client” nie może być ustawiona na wartość „NULL”
nerdess
Po wielu nieudanych próbach innych rozwiązań, to zadziałało doskonale przy pierwszej próbie.
Vincent Polisi,
NIE działa z niektórymi nowymi stronami Wordpress. Podczas importowania na drugi serwer generuje ten błąd przy pierwszej tabeli, którą próbuje zaimportować (wp_commentmeta) # 1064 - Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL, aby użyć właściwej składni w pobliżu 'TYPE = MyISAM AUTO_INCREMENT = 1' w linii 19
that-ben
nie miało to dla mnie żadnego znaczenia, wciąż otrzymuję te same komunikaty o błędach
pealo86,
jesteś szefem
Aseel Ashraf
159

Jeśli .sqlplik został już wyeksportowany , najlepiej jest znaleźć i zastąpić następujące elementy, jeśli masz je w swoim pliku:

  • utf8mb4_0900_ai_ci do utf8_unicode_ci
  • utf8mb4 do utf8
  • utf8_unicode_520_ci do utf8_unicode_ci

Zastąpi utf8mb4_unicode_cito utf8_unicode_ci. Teraz idziesz do swojego phpMyAdmin cPanel i ustawiasz sortowanie DB utf8_unicode_cipoprzez Operacje> Sortowanie .

Jeśli eksportujesz do pliku .sql, lepiej zmienić format, w jaki sposób eksportujesz plik. Sprawdź odpowiedź Evstera (jest na tej samej stronie)

Rangel R. Morais
źródło
2
działa idealnie razem z tym jednym stackoverflow.com/a/30694416/1022726
iurii
Dla wszystkich ludzi unix: sed -i.bak s/utf8mb4/utf8/g FILE_NAME. Spowoduje to znalezienie wszystkich wystąpień utf8mb4w FILE_NAME i zastąpienie go utf8podczas zapisywania kopii oryginalnego pliku w FILE_NAME.bak. Być może trzeba będzie go dostosować, aby określić dokładną koalicję w twoim przypadku, ale to dopiero początek :)
DaveLak
1
Musiałem również zastąpić: utf8_unicode_520_ci przez: utf8_unicode_ci
Nick Rivers
Lub poprzez VI: vi dump.sqla następnie w tym poprzez: :%s/uf8mb4/utf8/g.
Valentin Grégoire,
2
i wymienić utf8_0900_ai_cizutf8_unicode_ci
Irfan Yusanif
44

używam tego w systemie Linux:

sed -i 's/utf8mb4/utf8/g' your_file.sql
sed -i 's/utf8_unicode_ci/utf8_general_ci/g' your_file.sql
sed -i 's/utf8_unicode_520_ci/utf8_general_ci/g' your_file.sql

następnie przywróć plik_pliku.sql

mysql -u yourdBUser -p yourdBPasswd yourdB < your_file.sql
halilintar8
źródło
1
Istnieje komentarz do innej odpowiedzi, którą należy powtórzyć tutaj. Wersja sed OS OS X wymaga dodatkowego argumentu za flagą -i. Tak sed -i '' ....działa
Kent
2
Musiałem też to uruchomić:sed -i 's/utf8_0900_ai_ci/utf8_general_ci/g' your_file.sql
Michael Hays,
28

Wordpress 4.2 wprowadził obsługę kodowania znaków „utf8mb4” ze względów bezpieczeństwa , ale obsługuje go tylko MySQL 5.5.3 i nowsze . Sposób, w jaki instalator (i aktualizator) sobie z tym radzi, polega na sprawdzeniu wersji MySQL, a baza danych zostanie uaktualniona do utfmb4 tylko wtedy, gdy jest obsługiwana .

Brzmi świetnie w teorii, ale problem (jak odkryłeś) polega na migracji baz danych z serwera MySQL, który obsługuje utf8mb4 na taki, który tego nie robi. Chociaż odwrotnie powinno działać, jest to w zasadzie operacja jednokierunkowa.

Jak podkreślił Evster ty może mieć sukces przy użyciu funkcji phpMyAdmin za „Eksport”. Użyj opcji „ Metoda eksportu: niestandardowa ” i „ System bazy danych lub starszy serwer MySQL, aby zmaksymalizować kompatybilność danych wyjściowych z: ” rozwijanym menu wybierz „ MYSQL 40 ”.

W przypadku eksportu z wiersza poleceń za pomocą mysqldump. Spójrz na flagę:

$ mysqldump --compatible=mysql4

Uwaga: Jeśli w bazie danych znajdują się 4-bajtowe znaki, zostaną one uszkodzone.

Wreszcie, dla każdego, kto korzysta z popularnej wtyczki WP Migrate DB PRO, użytkownik w tym wątku Wordpress.org informuje, że migracja jest zawsze obsługiwana poprawnie, ale nie mogłem znaleźć niczego oficjalnego.

Wtyczka WP Migrate DB tłumaczy bazę danych z jednego sortowania na drugi, gdy przenosi strony 4.2 między hostami z MySQL w wersji wcześniejszej lub późniejszej niż 5.5.3

Obecnie wydaje się, że nie ma możliwości zrezygnowania z aktualizacji bazy danych. Jeśli więc używasz przepływu pracy, w którym migrujesz witrynę z serwera lub hosta lokalnego za pomocą MySQL> 5.5.3, do takiego, który używa starszej wersji MySQL, możesz mieć pecha.

Mark Thomson
źródło
Całkowicie zmieniłem kompatybilność na „MYSQL 40”.
Keryn Gill
3
Jeśli następnie spróbujesz zaimportować zrzut zgodny z mysql4 do bazy danych po wersji 5.5.3 (korzystam z wersji 5.5.28), to się nie powiedzie, ponieważ skrypt zawiera to, TYPE=MyISAMco zostało usunięte w wersji 5.1. Wyszukaj i zamień na ENGINE=MyISAM. Nie mogłem tego obejść za pomocą mysqldumpopcji wyjściowych.
icc97
26

W moim przypadku okazało się, że mój
nowy serwer działał MySQL 5.5,
stary serwer działał MySQL 5.6.
Wystąpił więc ten błąd podczas próby zaimportowania .sqlpliku, który wyeksportowałem ze starego serwera.

MySQL 5.5 nie obsługuje utf8mb4_unicode_520_ci, ale
MySQL 5.6.

Aktualizacja MySQL 5.6na nowym serwerze rozwiązała sortowanie błąd!

Jeśli chcesz zachować MySQL 5.5, możesz:
- wykonać kopię wyeksportowanego .sqlpliku
- zastąpić wystąpienia utf8mb4unicode520_cii utf8mb4_unicode_520_ci
... za pomocą utf8mb4_unicode_ci
- zaimportować zaktualizowany .sqlplik.

SherylHohman
źródło
1
Tak - przesyłanie do wersji 5.6 jest najprostszym rozwiązaniem do tego (a Ubuntu ma mysql-server-5.6pakiet, który możesz zainstalować, który automatycznie usunie wersję 5.5).
William Turrell,
15

W pliku wp-config.php znajduje się wiersz:

define('DB_CHARSET', 'utf8mb4');

Jeśli postępujesz zgodnie z instrukcjami Markouver / Evster , nie zapomnij zmienić tej linii na serwerze produkcyjnym na

define('DB_CHARSET', 'utf8');

w celu naprawy zepsutych 4-bajtowych znaków

Isk1n
źródło
1
Nie zapomnij również o modyfikacji define('DB_COLLATE', 'utf8_general_ci');. To mi pomogło.
Abduhafiz,
10

Po długich badaniach znalazłem rozwiązanie powyższego:

  1. Najpierw zmienisz domyślną wartość wp-config.php> Baza danych DB_CHARSET na „utf8”

  2. Kliknij kartę „Eksportuj” dla bazy danych

  3. Kliknij przycisk „Niestandardowy”

  4. Przejdź do sekcji zatytułowanej „Opcje specyficzne dla formatu” i zmień menu rozwijane „System baz danych lub starszy serwer MySQL, aby zmaksymalizować kompatybilność danych wyjściowych z:” z BRAK na MYSQL40.

  5. Przewiń w dół i kliknij Idź

Więc jesteś włączony.

Dead Boyz
źródło
7

Wygląda na to, że Twój host nie zapewnia wersji MySQL, która może uruchamiać tabele z sortowaniem utf8mb4.

Tabele WordPress zostały zmienione na utf8mb4 w wersji 4.2 (wydanej 23 kwietnia 2015 r.) W celu obsługi Emoji, ale do korzystania z niego potrzebny jest MySQL 5.5.3. 5.5.3 pochodzi z marca 2010 r., więc zwykle powinna być powszechnie dostępna. Czy sprawdzasz, czy Twój hosting zapewnia tę wersję?

Jeśli nie, a aktualizacja nie jest możliwa, może być konieczne znalezienie innego hosta do uruchomienia najnowszych wersji WordPress (i zawsze powinieneś to zrobić ze względów bezpieczeństwa).

flomei
źródło
1
Możesz sprawdzić swoją wersję MySQL za pomocą wiersza poleceń za pomocą „mysql -V”
Edd Smith
2

Rozwiązałem więc w ten sposób, od MySQL 5.6 do MySQL 5.5:

$ mysqldump -u username -p --compatible=mysql4 database_name > database_name.sql
$ sed -i 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql

(Opcjonalnie) Utwórz .sql.gzplik:

$ gzip database_name.sql 

Wyjaśnienie

$ mysqldump -u username -p --compatible=mysql4 database_name > database_name.sql

Jak wyjaśniono w tej odpowiedzi , jest to tylko odpowiednik tych opcji z phpMyAdmin: „System bazy danych lub starszy serwer MySQL w celu zmaksymalizowania kompatybilności danych wyjściowych z:” rozwijanym menu wybierz „MYSQL 40” .

$ sed -i 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql

Potrzebujemy tego, aby rozwiązać ten problem:

BŁĄD 1064 (42000) w wierszu 18: Wystąpił błąd w składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL, czy jest poprawna składnia do użycia w pobliżu „TYPE = InnoDB” w wierszu 9

Andrea
źródło
1
Uwaga, jeśli używasz wersji OS X. dotyczącą sed: $ sed -i'' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql. Jeśli chcesz zachować kopię, tak jak database_name.sql.bakprzed sed, wymień:$ sed -i'bak' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql
Justin Fortier
możesz również wstawić sed.
davidbitton
Również jeśli używasz mysqldump na MySQL 8, musisz użyć --compatible=ansiopcji
AbstractVoid
1

Wystąpił również ten problem. Rozwiązaniem, które działało dla mnie, było otwarcie lokalnej bazy danych za pomocą Sequel Pro oraz zaktualizowanie Kodowania i Sortowania do utf8 / utf8_bin dla każdej tabeli przed importem.

Damian Walsh
źródło
1

Najłatwiejszym sposobem jest wyeksportowanie bazy danych .sql, otwarcie jej w Notepad ++ oraz „Wyszukaj i zamień” utf8mb4_unicode_cido, utf8_unicode_cia także zastąp utf8mb4do utf8. Nie zapomnij również zmienić sortowania bazy danych na utf8_unicode_ci(Operacje> Sortowanie).

Żuraw
źródło
0

otwórz plik sql w Notepad ++, a ctrl + H. następnie wpisz „ utf8mb4” podczas wyszukiwania i „ utf8” po zamianie. Problem zostanie wówczas rozwiązany.

Jan
źródło
Mówi „nieznane zestawienie utf8”
Cristian Traìna