# 1273 - การเปรียบเทียบที่ไม่รู้จัก: 'utf8mb4_unicode_ci' cPanel


183

ฉันมีฐานข้อมูล WordPress บนเครื่องท้องถิ่นของฉันที่ฉันต้องการถ่ายโอนไปยังโฮสต์ phpMyAdmin บน cPanel อย่างไรก็ตามเมื่อฉันพยายามนำเข้าฐานข้อมูลในสภาพแวดล้อมฉันได้รับข้อผิดพลาดนี้:

#1273 - Unknown collation: 'utf8mb4_unicode_ci' 

ฉันลองใช้ Google แล้วและทางออกเดียวที่ฉันพบคือข้อผิดพลาด phpmysql - # 1273 - # 1273 - การเปรียบเทียบที่ไม่รู้จัก: 'utf8mb4_general_ci'ซึ่งตอนนี้ไม่ได้ช่วยอะไรมาก ฉันได้ลองล้างคุกกี้แล้ว แต่ก็ยังใช้งานไม่ได้ กรุณาช่วย!


คำตอบ:


107

ฉันมีปัญหาเดียวกันกับเซิร์ฟเวอร์ของเราทุกรุ่นที่ใช้ MySQL รุ่นเก่า สิ่งนี้สามารถแก้ไขได้ด้วยการรันสคริปต์ PHP บันทึกรหัสนี้เป็นไฟล์และเรียกใช้งานโดยป้อนชื่อฐานข้อมูลผู้ใช้และรหัสผ่านและจะเปลี่ยนการจัดเรียงจากutf8mb4/utf8mb4_unicode_ciเป็นutf8/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
ดูเหมือนว่าจะเป็น overkill vsmysqldump --compatible=mysql4
icc97

2
สำหรับฉันมันใช้งานได้ อย่าลืมตั้งชื่อไฟล์db-convert.php
Fred K

1
ถ้าคุณทำ 'localhost' การป้อนข้อมูลมันสมบูรณ์แบบ
br4nnigan

2
mysqldump --compatible=mysql4หรือคำตอบด้านล่างเป็นตัวเลือกที่ดีกว่า ฉันไม่คิดว่าเป็นความคิดที่ฉลาดที่จะเปลี่ยนแปลงบางสิ่งเช่นนี้ในเว็บไซต์ที่ใช้งานได้ ดีกว่าที่จะส่งออกในรูปแบบที่ถูกต้องหรือหากไม่ใช่ตัวเลือกให้แก้ไขไฟล์ที่ส่งออก
Tisch

คุณช่วยชีวิตฉันไว้แล้วและทั้งหมดที่ฉันมอบให้คุณก็คือ +1
Taruc

229

เทคนิคในโพสต์นี้ใช้ได้สำหรับฉัน

1) คลิกแท็บ "ส่งออก" สำหรับฐานข้อมูล

2) คลิกปุ่มตัวเลือก "กำหนดเอง"

3) ไปที่หัวข้อ "ตัวเลือกเฉพาะรูปแบบ" และเปลี่ยนรายการแบบหล่นลงสำหรับ "ระบบฐานข้อมูลหรือเซิร์ฟเวอร์ MySQL รุ่นเก่าเพื่อเพิ่มความเข้ากันได้ของเอาต์พุตด้วย:" จาก NONE เป็น MYSQL40

4) เลื่อนไปที่ด้านล่างและคลิก "ไป"

ฉันไม่แน่ใจว่าการทำเช่นนี้ทำให้ข้อมูลสูญหาย แต่ในครั้งเดียวที่ฉันลองฉันไม่ได้สังเกตใด ๆ ไม่มีใครที่ตอบกลับในฟอรัมที่เชื่อมโยงกับด้านบน

แก้ไข 8/12/16 - ฉันเชื่อว่าการส่งออกฐานข้อมูลด้วยวิธีนี้ทำให้ฉันสูญเสียข้อมูลที่บันทึกในวิดเจ็ตBlack Studio TinyMCE Visual Editorแม้ว่าฉันจะไม่ได้ทำการทดสอบหลายรายการเพื่อยืนยัน


ไม่ทำงานสำหรับฉันฉันได้รับข้อผิดพลาด # 1231 - ตัวแปร 'character_set_client' ไม่สามารถตั้งค่าเป็น 'NULL'
nerdess

หลังจากความพยายามที่ล้มเหลวหลายครั้งในการแก้ปัญหาอื่น ๆ อันนี้ทำงานได้อย่างสมบูรณ์ในครั้งแรก
Vincent Polisi

ไม่ทำงานกับไซต์ Wordpress ใหม่บางไซต์ เมื่อนำเข้ามันบนเซิร์ฟเวอร์อื่นมันจะสร้างข้อผิดพลาดนี้ในตารางแรกที่พยายามนำเข้า (wp_commentmeta) # 1064 - คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ; ตรวจสอบคู่มือที่สอดคล้องกับรุ่นเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องใกล้กับ 'TYPE = MyISAM AUTO_INCREMENT = 1' ที่บรรทัดที่ 19
นั้น

สิ่งนี้ดูเหมือนจะไม่สร้างความแตกต่างให้ฉัน แต่ก็ยังได้รับข้อความแสดงข้อผิดพลาดเหมือนเดิม
pealo86

คุณคือหัวหน้า
Aseel Ashraf

159

หากคุณได้ส่งออก.sqlไฟล์แล้วสิ่งที่ดีที่สุดที่ควรทำคือค้นหาและแทนที่สิ่งต่อไปนี้หากคุณมีไฟล์เหล่านั้นในไฟล์ของคุณ:

  • utf8mb4_0900_ai_ci ถึง utf8_unicode_ci
  • utf8mb4 ถึง utf8
  • utf8_unicode_520_ci ถึง utf8_unicode_ci

มันจะเปลี่ยนไปutf8mb4_unicode_ci utf8_unicode_ciตอนนี้คุณไปที่ phpMyAdmin cPanel ของคุณและตั้งค่าการเปรียบเทียบฐานข้อมูลที่จะutf8_unicode_ciผ่านการดำเนินงาน> เปรียบเทียบ

หากคุณกำลังส่งออกไปยัง a .sqlจะเป็นการดีกว่าที่จะเปลี่ยนรูปแบบวิธีที่คุณส่งออกไฟล์ ลองดูAnwer ของ Evster (อยู่ในหน้าเดียวกับนี้)


2
มันทำงานได้อย่างสมบูรณ์พร้อมกับstackoverflow.com/a/30694416/1022726
iurii

สำหรับทุกคนที่คุณใช้ยูนิกซ์: sed -i.bak s/utf8mb4/utf8/g FILE_NAME. จะพบสิ่งที่เกิดขึ้นทั้งหมดutf8mb4ใน FILE_NAME และแทนที่ด้วยutf8ในขณะที่บันทึกสำเนาของไฟล์ต้นฉบับไปที่ FILE_NAME.bak คุณอาจจำเป็นต้องปรับแต่งให้ระบุรัฐบาลแน่นอนในกรณีของคุณ แต่นี่คือการเริ่มต้น :)
DaveLak

1
ฉันต้องแทนที่ด้วย: utf8_unicode_520_ci ด้วย: utf8_unicode_ci
Nick Rivers

หรือผ่านทาง vi: และจากนั้นในทางทำเช่นนี้:vi dump.sql :%s/uf8mb4/utf8/g
Valentin Grégoire

2
และแทนที่utf8_0900_ai_ciด้วยutf8_unicode_ci
Irfan Yusanif

44

ฉันใช้สิ่งนี้ใน 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

จากนั้นกู้คืน your_file.sql

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

1
มีความคิดเห็นเกี่ยวกับคำตอบอื่นซึ่งมีการทำซ้ำที่นี่ sed เวอร์ชัน OS X ต้องการอาร์กิวเมนต์พิเศษหลังจากแฟล็ก -i ได้sed -i '' ....ผล
เคนต์

2
ฉันต้องเรียกใช้เช่นกัน:sed -i 's/utf8_0900_ai_ci/utf8_general_ci/g' your_file.sql
Michael Hays

28

Wordpress 4.2 ได้รับการสนับสนุนสำหรับการเข้ารหัสอักขระ "utf8mb4" เพื่อเหตุผลด้านความปลอดภัยแต่มีเพียง MySQL 5.5.3 และมากกว่านั้นที่รองรับ วิธีการติดตั้ง (และอัพเดท) จะจัดการกับเรื่องนี้ก็คือว่ามันจะตรวจสอบ MySQL รุ่นของคุณและฐานข้อมูลของคุณจะได้รับการอัพเกรดให้ utfmb4 เท่านั้นหากได้รับการสนับสนุน

ฟังดูดีในทางทฤษฎี แต่ปัญหา (อย่างที่คุณค้นพบ) คือเมื่อคุณย้ายฐานข้อมูลจากเซิร์ฟเวอร์ MySQL ที่รองรับ utf8mb4 ไปยังฐานข้อมูลที่ไม่รองรับ ในขณะที่วิธีอื่น ๆ ควรใช้งานได้ แต่เป็นการดำเนินการทางเดียว

ตามที่ระบุโดย Evster คุณอาจประสบความสำเร็จในการใช้ฟีเจอร์ "ส่งออก" ของ PHPMYAdmin ใช้ " วิธีการส่งออก: กำหนดเอง " และสำหรับ " ระบบฐานข้อมูลหรือเซิร์ฟเวอร์ MySQL รุ่นเก่าเพื่อเพิ่มความเข้ากันได้ของเอาต์พุตด้วย: " เลือกดรอปดาวน์ " MYSQL 40 "

สำหรับการส่งออกบรรทัดคำสั่งโดยใช้ mysqldump ไปดูธง:

$ mysqldump --compatible=mysql4

หมายเหตุ: หากมีอักขระ 4 ไบต์ในฐานข้อมูลอักขระเหล่านั้นจะเสียหาย

สุดท้ายสำหรับทุกคนที่ใช้ปลั๊กอิน WP Migrate DB PRO ที่ได้รับความนิยมผู้ใช้ในเธรด Wordpress.orgรายงานว่าการโยกย้ายนั้นจัดการได้อย่างถูกต้องเสมอ แต่ฉันไม่สามารถหาสิ่งที่เป็นทางการได้

ปลั๊กอิน WP Migrate DB แปลฐานข้อมูลจากการเปรียบเทียบหนึ่งไปยังอีกการเปรียบเทียบเมื่อมันย้าย 4.2 ไซต์ระหว่างโฮสต์ที่มี MySQL ก่อนหรือหลัง 5.5.3

ในขณะนี้ดูเหมือนจะไม่มีวิธีในการยกเลิกการอัปเดตฐานข้อมูล ดังนั้นหากคุณใช้เวิร์กโฟลว์ที่คุณย้ายเว็บไซต์จากเซิร์ฟเวอร์หรือโฮสต์ในพื้นที่ที่มี MySQL> 5.5.3 ไปเป็นหนึ่งที่ใช้รุ่น MySQL รุ่นเก่าคุณอาจโชคไม่ดี


การเปลี่ยนความเข้ากันได้เป็น "MYSQL 40" ได้ผลสำหรับฉันโดยสิ้นเชิง
Keryn Gill

3
ถ้าคุณลองและนำเข้าดัมพ์ mysql4 ที่เข้ากันได้ไปยังฐานข้อมูลโพสต์ v5.5.3 (ฉันใช้ 5.5.28) มันก็ล้มเหลวเพราะสคริปต์รวมTYPE=MyISAMเอามันถูกลบใน v5.1 ENGINE=MyISAMดำเนินการค้นหาและแทนที่ด้วย ฉันไม่เห็นวิธีแก้ไขปัญหานี้โดยใช้mysqldumpตัวเลือกเอาต์พุต
icc97

26

ในกรณีของฉันมันกลับกลายเป็นของฉัน
เซิร์ฟเวอร์ใหม่ที่กำลังวิ่งMySQL 5.5, เซิร์ฟเวอร์เก่ากำลังวิ่ง
ดังนั้นฉันได้รับข้อผิดพลาดนี้เมื่อพยายามนำเข้าไฟล์ที่ฉันส่งออกจากเซิร์ฟเวอร์เก่าของฉันMySQL 5.6
.sql

MySQL 5.5 ไม่รองรับutf8mb4_unicode_520_ciแต่
MySQL 5.6 ไม่รองรับ

การอัปเดตเป็นMySQL 5.6บนเซิร์ฟเวอร์ใหม่แก้ไขการเปรียบเทียบข้อผิดพลาด!

หากคุณต้องการเก็บ MySQL 5.5 คุณสามารถ:
- ทำสำเนาของ.sqlไฟล์ที่ส่งออกของคุณ
- แทนที่อินสแตนซ์ของutf8mb4unicode520_ciและutf8mb4_unicode_520_ci
... ด้วยutf8mb4_unicode_ci
- นำเข้า.sqlไฟล์ที่อัปเดตของคุณ


1
ใช่ - การอัปโหลดไปที่ 5.6 เป็นวิธีที่ง่ายที่สุดสำหรับเรื่องนี้ (และ Ubuntu มีmysql-server-5.6แพ็คเกจที่คุณสามารถติดตั้งซึ่งจะลบ 5.5 ให้กับคุณโดยอัตโนมัติ)
William Turrell

15

มีบรรทัดใน wp-config.php:

define('DB_CHARSET', 'utf8mb4');

ถ้าคุณทำตามMarkouver ของ / Evster ของคำแนะนำไม่ลืมที่จะเปลี่ยนแปลงบรรทัดนี้บนเซิร์ฟเวอร์การผลิตเพื่อ

define('DB_CHARSET', 'utf8');

เพื่อแก้ไขอักขระ 4 ไบต์ที่เสียหาย


1
นอกจากนี้อย่าลืมที่จะแก้ไขdefine('DB_COLLATE', 'utf8_general_ci');เช่นกัน สิ่งนี้ช่วยฉันได้
Abduhafiz

10

หลังจากการวิจัยเป็นเวลานานฉันได้พบวิธีแก้ปัญหาสำหรับข้างต้น

  1. ประการแรกคุณเปลี่ยน wp-config.php> ฐานข้อมูล DB_CHARSET เริ่มต้นเป็น "utf8"

  2. คลิกที่แท็บ "ส่งออก" สำหรับฐานข้อมูล

  3. คลิกปุ่มตัวเลือก "กำหนดเอง"

  4. ไปที่หัวข้อ "ตัวเลือกเฉพาะรูปแบบ" และเปลี่ยนรายการแบบหล่นลงสำหรับ "ระบบฐานข้อมูลหรือเซิร์ฟเวอร์ MySQL รุ่นเก่าเพื่อเพิ่มความเข้ากันได้ของเอาต์พุตด้วย:" จาก NONE เป็น MYSQL40

  5. เลื่อนไปที่ด้านล่างและคลิกไป

แล้วคุณจะอยู่


7

ดูเหมือนว่าโฮสต์ของคุณจะไม่ให้ MySQL เวอร์ชันที่สามารถเรียกใช้ตารางที่มีการจัดเรียง utf8mb4

ตาราง WordPress ถูกเปลี่ยนเป็น utf8mb4 ด้วยเวอร์ชัน 4.2 (เผยแพร่เมื่อวันที่ 23 เมษายน 2015) เพื่อรองรับ Emojis แต่คุณต้องใช้ MySQL 5.5.3 เพื่อใช้งาน 5.5.3 คือตั้งแต่เดือนมีนาคม 2010 ดังนั้นจึงควรเปิดให้ใช้กันอย่างแพร่หลาย คุณตรวจสอบว่า hoster ของคุณมีเวอร์ชันนั้นหรือไม่

ถ้าไม่และการอัพเกรดเป็นไปไม่ได้คุณอาจต้องหาผู้อุปถัมภ์คนอื่นเพื่อใช้งาน WordPress เวอร์ชั่นล่าสุด (และคุณควรทำเช่นนั้นด้วยเหตุผลด้านความปลอดภัย)


1
คุณสามารถตรวจสอบ MySQL ของคุณผ่านทางบรรทัดคำสั่งด้วย "mysql -V"
Edd Smith

2

ดังนั้นฉันจึงแก้ไขด้วยวิธีนี้จาก MySQL 5.6 ถึง 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

(ไม่บังคับ) สร้าง.sql.gzไฟล์:

$ gzip database_name.sql 

คำอธิบาย

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

ตามที่อธิบายในเรื่องนี้คำตอบนี้เป็นเพียงเทียบเท่าของตัวเลือกนี้จาก phpMyAdmin นี้: "ระบบฐานข้อมูลหรือเซิร์ฟเวอร์ MySQL เก่าเพื่อเพิ่มความเข้ากันได้การส่งออกด้วย:" แบบเลื่อนลงเลือก "MYSQL 40"

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

เราต้องการสิ่งนี้เพื่อแก้ปัญหานี้:

ข้อผิดพลาด 1064 (42000) ที่บรรทัดที่ 18: คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชั่นเซิร์ฟเวอร์ MySQL ของคุณเพื่อหาไวยากรณ์ที่ถูกต้องที่จะใช้ใกล้กับ 'TYPE = InnoDB' ที่บรรทัด 9


1
หมายเหตุถ้าคุณกำลังใช้รุ่น OS X ของ $ sed -i'' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sqlsed: หากคุณต้องการเก็บสำเนาไว้database_name.sql.bakก่อนหน้า Sed แทนที่:$ sed -i'bak' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql
Justin Fortier

คุณยังสามารถ sedinline
davidbitton

นอกจากนี้หากคุณใช้ mysqldump บน MySQL 8 คุณต้องใช้--compatible=ansiตัวเลือก
AbstractVoid

1

ฉันยังประสบปัญหานี้ วิธีแก้ปัญหาที่ใช้งานได้สำหรับฉันคือการเปิดฐานข้อมูลท้องถิ่นด้วยSequel Proและอัปเดตการเข้ารหัสและการจัดเรียงเป็น utf8 / utf8_bin สำหรับแต่ละตารางก่อนนำเข้า


1

วิธีที่ง่ายที่สุดที่จะทำคือการส่งออกฐานข้อมูลของคุณที่จะ.sqlเปิดใน Notepad ++ และ "ค้นหาและแทนที่ว่า" utf8mb4_unicode_ciไปutf8_unicode_ciและเปลี่ยนไปutf8mb4 utf8อย่าลืมเปลี่ยนการจัดเรียงฐานข้อมูลเป็นutf8_unicode_ci(การดำเนินการ> การจัดเรียง)


0

เปิดไฟล์ sql บน Notepad ++ ctrl + H. จากนั้นคุณใส่ " utf8mb4" ในการค้นหาและ " utf8" แทน ปัญหาจะได้รับการแก้ไขแล้ว


มันบอกว่า "การจัดเรียงที่ไม่รู้จัก utf8"
Cristian Traìna
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.