# 1273 - Bilinmeyen harmanlama: 'utf8mb4_unicode_ci' cPanel


183

Yerel makinemde cPanel'de barındırılan bir phpMyAdmin'e aktarmak istediğim bir WordPress veritabanı var. Ancak, veritabanını ortama almaya çalıştığınızda, bu hatayı almaya devam:

#1273 - Unknown collation: 'utf8mb4_unicode_ci' 

Etrafında Google denedim ve bulabildiğim tek çözüm bu bir phpmysql hatası - # 1273 - # 1273 - Bilinmeyen harmanlama: 'utf8mb4_general_ci' şimdiye kadar çok yardım değil. Çerezleri temizlemeyi denedim ama hala çalışmıyor. Lütfen yardım et!


Yanıtlar:


107

Tüm sunucularımızın MySQL'in eski sürümlerini çalıştırmasıyla aynı sorunu yaşadım. Bu, bir PHP betiği çalıştırılarak çözülebilir. Bu kodu bir dosyaya kaydedin ve veritabanı adı, kullanıcı ve şifre girerek çalıştırın ve harmanlamayı utf8mb4/utf8mb4_unicode_ciyerineutf8/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>";
}

?>

47
Bu overkill vs gibi görünüyormysqldump --compatible=mysql4
icc97

2
Benim için çalıştı. Dosyayı adlandırmayı unutmayındb-convert.php
Fred K

1
'Localhost' girişini yaparsanız mükemmel olur.
br4nnigan

2
mysqldump --compatible=mysql4ya da aşağıdaki cevap daha iyi bir seçenektir. Canlı bir sitede böyle bir şeyi değiştirmenin akıllıca bir fikir olduğunu düşünmüyorum. Doğru biçimde dışa aktarmak daha iyidir veya bu bir seçenek değilse dışa aktarılan dosyayı düzenleyin.
Tisch

Böylece hayatımı kurtardın ve sana rn verebileceğim tek şey +1.
Taruc

229

Bu yazıdaki teknik benim için çalıştı

1) Veritabanı için "Dışa Aktar" sekmesini tıklayın

2) "Özel" radyo düğmesini tıklayın

3) "Biçime özgü seçenekler" başlıklı bölüme gidin ve NONE ile MYSQL40 arasındaki çıktı uyumluluğunu en üst düzeye çıkarmak için "Veritabanı sistemi veya daha eski MySQL sunucusu" açılır menüsünü değiştirin.

4) En alta kaydırın ve "GİT" i tıklayın.

Bunu yaparken herhangi bir veri kaybına neden olup olmadığından emin değilim, ancak bir kez denediğimde fark etmedim. Forumlarda yanıt veren herkes de yukarıda yazılı olanlarla bağlantılı değildi.

Düzenleme 8/12/16 - Bu şekilde bir veritabanını dışa aktarmanın Black Studio TinyMCE Visual Editor widget'larında kaydedilen verileri kaybetmeme neden olduğuna inanıyorum , ancak onaylamak için birden fazla test çalıştırmadım.


benim için çalışmadı, # 1231 hatasını aldım - Değişken 'character_set_client', 'NULL' değerine ayarlanamıyor
nerdess

Diğer çözümlere yönelik başarısız birçok denemeden sonra, bu ilk denemede mükemmel çalıştı.
Vincent Polisi

Bazı yeni Wordpress siteleriyle ÇALIŞMAZ. Diğer sunucuya alırken, almaya çalıştığı ilk tabloda bu hatayı oluşturur (wp_commentmeta) # 1064 - SQL sözdiziminizde bir hata var; 19. satırda 'TYPE = MyISAM AUTO_INCREMENT = 1' yakınında kullanılacak doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuzu kontrol edin
that-ben

Bu benim için bir fark yaratmadı, yine aynı hata mesajlarını
alıyordu

sen patronsun
Aseel Ashraf

159

Zaten bir .sqldosyayı dışa aktardıysanız , yapmanız gereken en iyi şey, dosyanızda varsa aşağıdakileri Bulmak ve Değiştirmektir:

  • utf8mb4_0900_ai_ci için utf8_unicode_ci
  • utf8mb4 için utf8
  • utf8_unicode_520_ci için utf8_unicode_ci

Bu yerini alacak utf8mb4_unicode_ciiçin utf8_unicode_ci. Şimdi phpMyAdmin cPanel'inize gidin ve DB harmanlamasını İşlemler> Harmanlamautf8_unicode_ci yoluyla ayarlayın .

Eğer bir ihraç varsa .sql, bu dosyayı dışa nasıl gittiği hakkında biçimini değiştirmek daha iyidir. Evster'ın anwer'ına göz atın (bununla aynı sayfada)


2
bu biriyle birlikte mükemmel çalışıyor stackoverflow.com/a/30694416/1022726
iurii

Senin tüm unix millet için sed -i.bak s/utf8mb4/utf8/g FILE_NAME. Bu işlem utf8mb4FILE_NAME içindeki tüm tekrarları bulur utf8ve orijinal dosyanın bir kopyasını FILE_NAME.bak klasörüne kaydederken onun yerine geçer . Durumunuzdaki koalisyonu belirtmek için
ince

1
Ayrıca şunu değiştirmek zorunda kaldım: utf8_unicode_520_ci ile: utf8_unicode_ci
Nick Rivers

Ya üzeri vi: vi dump.sqlve sonra aracılığı bunu: :%s/uf8mb4/utf8/g.
Valentin Grégoire

2
ve değiştirme utf8_0900_ai_ciileutf8_unicode_ci
İrfan Yusanif

44

linux bu kullanın:

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

sonra dosya_dosyasını geri yükle

mysql -u yourdBUser -p yourdBPasswd yourdB < your_file.sql

1
Burada tekrar eden başka bir cevap hakkında bir yorum var. Sed'in OS X sürümü -i bayrağından sonra fazladan bir argüman gerektirir. İşe sed -i '' ....yarıyor.
Kent

2
Bunu da çalıştırmak zorunda kaldım:sed -i 's/utf8_0900_ai_ci/utf8_general_ci/g' your_file.sql
Michael Hays

28

Wordpress 4.2, güvenlik nedeniyle "utf8mb4" karakter kodlaması için destek sağladı , ancak yalnızca MySQL 5.5.3 ve daha üstü destekledi. Yükleyicinin (ve güncelleyicinin) bunu işleme biçimi MySQL sürümünüzü kontrol etmesidir ve veritabanınız yalnızca destekleniyorsa utfmb4'e yükseltilir .

Bu teoride kulağa hoş geliyor, ancak problem (keşfettiğiniz gibi), utf8mb4'ü destekleyen bir MySQL sunucusundan veritabanlarını geçirmediğinizde ortaya çıkıyor. Diğer yolun çalışması gerekirken, temelde tek yönlü bir işlemdir.

Evster'ın işaret ettiği gibi PHPMYAdmin'in "Dışa Aktar" özelliğini kullanarak başarılı olabilirsiniz . Çıktı uyumluluğunu en üst düzeye çıkarmak için " Dışa Aktarma Yöntemi: Özel " ve " Veritabanı sistemi veya daha eski MySQL sunucusu için " kullanın : "açılan" MYSQL 40 "ı seçin .

Komut satırı için mysqldump kullanarak dışa aktarın. Bayrağa bir göz atın:

$ mysqldump --compatible=mysql4

Not: Veritabanında 4 baytlık karakterler varsa, bunlar bozulur.

Son olarak, popüler WP Migrate DB PRO eklentisini kullanan herkes için, bu Wordpress.org iş parçacığındaki bir kullanıcı , geçişin her zaman düzgün bir şekilde işlendiğini ancak resmi bir şey bulamadığımı bildiriyor.

WP Migrate DB eklentisi, 5.5.3 öncesi veya sonrası ana bilgisayarlar arasında 4.2 siteyi taşıdığında veritabanını bir harmanlamadan diğerine çevirir

Şu anda, veritabanı güncellemesinden çıkmanın bir yolu yok gibi görünüyor. Bu nedenle, bir siteyi sunucudan veya localhost'tan MySQL> 5.5.3 ile eski bir MySQL sürümünü kullanan bir siteye geçirdiğiniz bir iş akışı kullanıyorsanız, şansınız olmayabilir.


Uyumluluğu "MYSQL 40" olarak değiştirmek tamamen benim için çalıştı.
Keryn Gill

3
Daha sonra mysql4 uyumlu dökümü bir post v5.5.3 veritabanına (5.5.28 kullanıyorum) içe aktarırsanız, v5.1'de TYPE=MyISAMkaldırılan komut dosyası içerdiğinden başarısız olur . Bir arama yapın ve ile değiştirin ENGINE=MyISAM. mysqldumpÇıkış seçeneklerini kullanarak bu konuda bir yol göremedim .
icc97

26

Benim durumumda
yeni sunucum çalışıyordu MySQL 5.5,
eski sunucu çalışıyordu MySQL 5.6. Eski sunucumdan dışa aktardığım dosyayı
içe aktarmaya çalışırken bu hatayı aldım .sql.

MySQL 5.5 desteklemiyor utf8mb4_unicode_520_ci, ancak
MySQL 5.6 destekliyor .

MySQL 5.6Yeni sunucuda güncelleme, harmanlama hatasını çözdü!

MySQL 5.5'i korumak istiyorsanız, şunları yapabilirsiniz:
- dışa aktarılan .sqldosyanızın bir kopyasını oluşturun
- utf8mb4unicode520_cive utf8mb4_unicode_520_ci
... örneklerini değiştirin utf8mb4_unicode_ci
- güncellenmiş .sqldosyanızı içe aktarın .


1
Evet - 5.6'ya yüklemek bunun için en basit çözümdür (ve Ubuntu'nun mysql-server-5.6yükleyebileceğiniz ve sizin için 5.5'i otomatik olarak kaldıracak bir paketi vardır ).
William Turrell

15

Wp-config.php içinde bir satır vardır:

define('DB_CHARSET', 'utf8mb4');

Eğer izlerseniz Markouver en / Evster en talimatları, üretim sunucusunda bu satırı değiştirmek unutmayın

define('DB_CHARSET', 'utf8');

bozuk 4 baytlık karakterleri düzeltmek için


1
Ayrıca değiştirmeyi define('DB_COLLATE', 'utf8_general_ci');de unutmayın . Bu bana yardımcı oldu.
Abduhafiz

10

Uzun süre araştırma yaptıktan sonra yukarıdaki çözümü buldum:

  1. Öncelikle wp-config.php> Veritabanı DB_CHARSET varsayılanını "utf8" olarak değiştirirsiniz

  2. Veritabanı için "Dışa Aktar" sekmesini tıklayın

  3. "Özel" radyo düğmesini tıklayın

  4. "Biçime özgü seçenekler" başlıklı bölüme gidin ve NONE'den MYSQL40'a çıktı uyumluluğunu en üst düzeye çıkarmak için "Veritabanı sistemi veya daha eski MySQL sunucusu" açılır menüsünü değiştirin.

  5. En alta kaydırın ve git'i tıklayın

O zaman devam ediyorsun.


7

Ana makineniz, utf8mb4 harmanlama ile tabloları çalıştırabilen bir MySQL sürümü sağlamıyor gibi görünüyor.

WordPress tabloları, Emojileri desteklemek için Sürüm 4.2 (23 Nisan 2015'te yayınlandı) ile utf8mb4 olarak değiştirildi, ancak kullanmak için MySQL 5.5.3'e ihtiyacınız var. 5.5.3. Mart 2010'dan beri, normalde yaygın olarak kullanılabilir olmalıdır. Barındırıcınızın bu sürümü sağlayıp sağlamadığını kontrol ediyor musunuz?

Değilse ve yükseltme mümkün değilse, en son WordPress sürümlerini çalıştırmak için başka bir barındırıcıya bakmanız gerekebilir (ve bunu her zaman güvenlik nedeniyle yapmalısınız).


1
MySQL sürümünüzü "mysql -V" komut satırıyla kontrol edebilirsiniz
Edd Smith

2

Bu yüzden MySQL 5.6'dan MySQL 5.5'e bu şekilde çözdüm:

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

(İsteğe bağlı) Bir .sql.gzdosya oluşturun :

$ gzip database_name.sql 

açıklama

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

Bu cevapta açıklandığı gibi bu , phpMyAdmin'deki bu seçeneklerin eşdeğeridir: "Çıktı uyumluluğunu en üst düzeye çıkarmak için veritabanı sistemi veya daha eski MySQL sunucusu:" açılır menü seçin "MYSQL 40" .

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

Bu sorunu çözmek için buna ihtiyacımız var:

18. satırda ERROR 1064 (42000): SQL sözdiziminizde bir hata var; 9. satırdaki 'TYPE = InnoDB' yakınında kullanılacak doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuza bakın


1
OS X'in sed: sürümünü kullanıyorsanız unutmayın $ sed -i'' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql. database_name.sql.bakSed yerine önceki gibi bir kopyasını tutmak istiyorsanız :$ sed -i'bak' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql
Justin Fortier

ayrıca satır içi de yapabilirsiniz sed.
davidbitton

Ayrıca MySQL 8 üzerinde mysqldump çalıştırıyorsanız, şu --compatible=ansiseçeneği kullanmanız gerekir
AbstractVoid


1

Yapmanın en kolay yolu için veritabanı ihracat ise .sql, açmaya, Not Defteri ++ ve "Ara ve Değiştir" utf8mb4_unicode_ciiçin utf8_unicode_cive ayrıca değiştirilmesi utf8mb4için utf8. Ayrıca veritabanı harmanlamasını utf8_unicode_ci(İşlemler> Harmanlama) olarak değiştirmeyi unutmayın .


0

sql dosyasını Notepad ++ ile açın ve ctrl + H. sonra utf8mb4arama üzerine " utf8" ve yerine " " koyun . Sorun daha sonra düzeltilecektir.


"Bilinmeyen harmanlama utf8"
yazıyor
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.