# 1273 - Đối chiếu không xác định: 'utf8mb4_unicode_ci' cPanel


183

Tôi có một cơ sở dữ liệu WordPress trên máy cục bộ mà tôi muốn chuyển sang phpMyAdmin được lưu trữ trên cPanel. Tuy nhiên, khi tôi cố gắng nhập cơ sở dữ liệu vào môi trường, tôi tiếp tục gặp lỗi này:

#1273 - Unknown collation: 'utf8mb4_unicode_ci' 

Tôi đã cố gắng tìm kiếm trên Google và giải pháp duy nhất tôi có thể tìm thấy là lỗi phpmysql này - # 1273 - # 1273 - Đối chiếu không xác định: 'utf8mb4_general_ci' mà hiện tại không có nhiều trợ giúp. Tôi đã thử xóa cookie nhưng nó vẫn không hoạt động. Xin vui lòng giúp đỡ!


Phiên bản nào của WordPress? Xem make.wordpress.org/core/2015/04/02/the-utf8mb4-upTHER
Rick James

Câu trả lời:


107

Tôi gặp vấn đề tương tự như tất cả các máy chủ của chúng tôi chạy các phiên bản MySQL cũ hơn. Điều này có thể được giải quyết bằng cách chạy một kịch bản PHP. Lưu mã này vào một tệp và chạy nó nhập tên cơ sở dữ liệu, người dùng và mật khẩu và nó sẽ thay đổi đối chiếu từ utf8mb4/utf8mb4_unicode_cithànhutf8/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
Điều này có vẻ như quá mức so vớimysqldump --compatible=mysql4
icc97

2
Đối với tôi nó đã làm việc. Nhớ đặt tên cho tệpdb-convert.php
Fred K

1
Nếu bạn tạo 'localhost' một đầu vào thì nó hoàn hảo.
br4nnigan

2
mysqldump --compatible=mysql4hoặc câu trả lời dưới đây là một lựa chọn tốt hơn. Tôi không nghĩ rằng đó là một ý tưởng khôn ngoan để thay đổi một cái gì đó như thế này trên một trang web trực tiếp. Tốt hơn là xuất theo định dạng chính xác hoặc nếu đó không phải là một tùy chọn, hãy chỉnh sửa tệp đã xuất.
Tisch

Vì vậy, bạn vừa cứu mạng tôi, và tất cả những gì tôi có thể cho bạn là 1 +1.
Taruc

229

Kỹ thuật trong bài này làm việc cho tôi

1) Nhấp vào tab "Xuất" cho cơ sở dữ liệu

2) Nhấp vào nút radio "Tùy chỉnh"

3) Chuyển đến phần có tiêu đề "Tùy chọn định dạng cụ thể" và thay đổi danh sách thả xuống cho "Hệ thống cơ sở dữ liệu hoặc máy chủ MySQL cũ hơn để tối đa hóa khả năng tương thích đầu ra với:" từ NONE sang MYSQL40.

4) Cuộn xuống phía dưới và nhấp vào "GO".

Tôi không chắc chắn nếu làm điều này gây ra bất kỳ mất dữ liệu, tuy nhiên trong một lần tôi đã thử nó tôi đã không nhận thấy bất kỳ. Không ai phản hồi trong các diễn đàn liên kết ở trên.

Chỉnh sửa 8/12/16 - Tôi tin rằng việc xuất cơ sở dữ liệu theo cách này khiến tôi mất dữ liệu được lưu trong các tiện ích Black Studio TinyMCE Visual Editor , mặc dù tôi chưa chạy thử nghiệm nhiều lần để xác nhận.


không hoạt động với tôi, tôi đã gặp lỗi # 1231 - Biến 'character_set_client' không thể được đặt thành giá trị của 'NULL'
nerdess

Sau nhiều lần thử thất bại ở các giải pháp khác, lần này hoạt động hoàn hảo ở lần thử đầu tiên.
Vincent Polisi

KHÔNG làm việc với một số trang Wordpress mới. Khi nhập nó trên máy chủ khác, nó sẽ tạo ra lỗi này trên bảng đầu tiên mà nó cố gắng nhập (wp_commentmeta) # 1064 - Bạn gặp lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết cú pháp phù hợp để sử dụng gần 'TYPE = MyISAM AUTO_INCREMENT = 1' tại dòng 19
đó là

điều này dường như không tạo ra bất kỳ sự khác biệt nào đối với tôi, vẫn nhận được các thông báo lỗi tương tự
pealo86

bạn là ông chủ
Aseel Ashraf

159

Nếu bạn đã xuất một .sqltệp, điều tốt nhất cần làm là Tìm và Thay thế các mục sau nếu bạn có chúng trong tệp của mình:

  • utf8mb4_0900_ai_ci đến utf8_unicode_ci
  • utf8mb4 đến utf8
  • utf8_unicode_520_ci đến utf8_unicode_ci

Nó sẽ thay thế utf8mb4_unicode_ciđể utf8_unicode_ci. Bây giờ bạn đi đến phpMyAdmin cPanel của bạn và đặt đối chiếu DB utf8_unicode_cithông qua các hoạt động> Đối chiếu .

Nếu bạn đang xuất sang a .sql, tốt hơn là thay đổi định dạng về cách bạn xuất tệp. Kiểm tra anster của Evster (nó ở cùng trang với cái này)


2
nó hoạt động hoàn hảo cùng với một stackoverflow.com/a/30694416/1022726
iurii

Đối với tất cả các bạn unix folks : sed -i.bak s/utf8mb4/utf8/g FILE_NAME. Điều này sẽ tìm thấy tất cả các lần xuất hiện utf8mb4trong FILE_NAME và thay thế nó utf8trong khi lưu một bản sao của tệp gốc vào FILE_NAME.bak. Bạn có thể cần phải điều chỉnh nó để chỉ định liên minh chính xác trong trường hợp của bạn nhưng đây là một sự khởi đầu :)
DaveLak

1
Tôi cũng đã phải thay thế: utf8_unicode_520_ci bằng: utf8_unicode_ci
Nick Rivers

Hoặc thông qua vi: vi dump.sqlvà sau đó thông qua làm điều này : :%s/uf8mb4/utf8/g.
Valentin Grégoire

2
và thay thế utf8_0900_ai_cibằngutf8_unicode_ci
Irfan Yusanif

44

tôi sử dụng cái này trong 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

sau đó khôi phục your_file.sql

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

1
Có một nhận xét về một câu trả lời khác, mà gấu lặp lại ở đây. Phiên bản OS X của sed yêu cầu thêm một đối số sau cờ -i. Vì vậy, sed -i '' ....làm việc.
Kent

2
Tôi cũng phải chạy cái này:sed -i 's/utf8_0900_ai_ci/utf8_general_ci/g' your_file.sql
Michael Hays

28

Wordpress 4.2 đã giới thiệu hỗ trợ mã hóa ký tự "utf8mb4" vì lý do bảo mật , nhưng chỉ hỗ trợ MySQL 5.5.3 và hỗ trợ nhiều hơn. Cách trình cài đặt (và trình cập nhật) xử lý việc này là nó kiểm tra phiên bản MySQL của bạn và cơ sở dữ liệu của bạn sẽ được nâng cấp lên utfmb4 chỉ khi được hỗ trợ .

Về lý thuyết nghe có vẻ tuyệt vời nhưng vấn đề (như bạn đã khám phá) là khi bạn di chuyển cơ sở dữ liệu từ máy chủ MySQL hỗ trợ utf8mb4 sang máy chủ không. Mặc dù cách khác nên hoạt động, về cơ bản, đó là hoạt động một chiều.

Như Evster đã chỉ ra, bạn có thể thành công khi sử dụng tính năng "Xuất khẩu" của PHPMYAdmin. Sử dụng " Phương thức xuất: Tùy chỉnh " và cho " Hệ thống cơ sở dữ liệu hoặc máy chủ MySQL cũ hơn để tối đa hóa khả năng tương thích đầu ra với: " thả xuống chọn " MYSQL 40 ".

Đối với xuất khẩu dòng lệnh bằng cách sử dụng mysqldump. Hãy nhìn vào lá cờ:

$ mysqldump --compatible=mysql4

Lưu ý: Nếu có bất kỳ ký tự 4 byte nào trong cơ sở dữ liệu, chúng sẽ bị hỏng.

Cuối cùng, đối với bất kỳ ai sử dụng plugin WP Migrate DB PRO phổ biến, một người dùng trong chuỗi Wordpress.org này báo cáo rằng việc di chuyển luôn được xử lý đúng cách nhưng tôi không thể tìm thấy bất cứ điều gì chính thức.

Plugin WP Migrate DB dịch cơ sở dữ liệu từ đối chiếu này sang đối chiếu khác khi nó di chuyển 4.2 trang web giữa các máy chủ với MySQL trước hoặc sau 5.5.3

Tại thời điểm này, dường như không có cách nào để từ chối cập nhật cơ sở dữ liệu. Vì vậy, nếu bạn đang sử dụng một quy trình làm việc trong đó bạn đang di chuyển một trang web từ máy chủ hoặc localhost với MySQL> 5.5.3 sang một trang sử dụng phiên bản MySQL cũ hơn, bạn có thể không gặp may.


Thay đổi khả năng tương thích với "MYSQL 40" hoàn toàn phù hợp với tôi.
Keryn Gill

3
Nếu sau đó bạn thử và nhập kết xuất tương thích mysql4 vào cơ sở dữ liệu bài v5.5.3 (tôi đang sử dụng 5.5.28) thì không thành công vì tập lệnh bao gồm TYPE=MyISAMđã bị xóa trong v5.1. Thực hiện tìm kiếm và thay thế bằng ENGINE=MyISAM. Tôi không thể thấy một cách xung quanh điều này bằng cách sử dụng các mysqldumptùy chọn đầu ra.
icc97

26

Trong trường hợp của tôi, hóa ra
máy chủ mới của tôi đang chạyMySQL 5.5 ,
máy chủ cũ đang chạy MySQL 5.6.
Vì vậy, tôi đã gặp lỗi này khi cố gắng nhập.sql tệp tôi đã xuất từ ​​máy chủ cũ của mình.

MySQL 5.5 không hỗ trợ utf8mb4_unicode_520_ci, nhưng
MySQL 5.6 thì có.

Cập nhật lên MySQL 5.6máy chủ mới giải quyết đối chiếu lỗi!

Nếu bạn muốn giữ lại MySQL 5.5, bạn có thể:
- tạo một bản sao của .sqltệp đã xuất của bạn
- thay thế các trường hợp utf8mb4unicode520_ciutf8mb4_unicode_520_ci
... bằng utf8mb4_unicode_ci
- nhập .sqltệp đã cập nhật của bạn .


1
Có - tải lên 5.6 là giải pháp đơn giản nhất cho việc này (và Ubuntu có mysql-server-5.6gói bạn có thể cài đặt sẽ tự động xóa 5.5 cho bạn).
William Turrell

15

Có một dòng trong wp-config.php:

define('DB_CHARSET', 'utf8mb4');

Nếu bạn làm theo Markouver của / Evster của hướng dẫn này, đừng quên thay đổi dòng này trên máy chủ sản xuất để

define('DB_CHARSET', 'utf8');

để sửa các ký tự 4 byte bị hỏng


1
Cũng đừng quên sửa đổi define('DB_COLLATE', 'utf8_general_ci');là tốt. Điều này đã giúp tôi.
Abduhafiz

10

Sau thời gian dài nghiên cứu tôi đã tìm ra giải pháp cho ở trên:

  1. Trước tiên, bạn thay đổi mặc định wp-config.php> Cơ sở dữ liệu DB_CHARSET thành "utf8"

  2. Nhấp vào tab "Xuất" cho cơ sở dữ liệu

  3. Nhấp vào nút radio "Tùy chỉnh"

  4. Đi tới phần có tiêu đề "Tùy chọn định dạng cụ thể" và thay đổi danh sách thả xuống cho "Hệ thống cơ sở dữ liệu hoặc máy chủ MySQL cũ hơn để tối đa hóa khả năng tương thích đầu ra với:" từ NONE sang MYSQL40.

  5. Cuộn xuống phía dưới và nhấp vào đi

Sau đó, bạn đang trên.


7

Có vẻ như máy chủ của bạn không cung cấp phiên bản MySQL có khả năng chạy các bảng với đối chiếu utf8mb4.

Các bảng WordPress đã được thay đổi thành utf8mb4 với Phiên bản 4.2 (phát hành vào ngày 23 tháng 4 năm 2015) để hỗ trợ Biểu tượng cảm xúc, nhưng bạn cần MySQL 5.5.3 để sử dụng nó.5.5.3. là từ tháng 3 năm 2010, vì vậy nó thường được phổ biến rộng rãi. Cna bạn kiểm tra xem hoster của bạn cung cấp phiên bản đó?

Nếu không, và không thể nâng cấp, bạn có thể phải tìm một người chơi khác để chạy các phiên bản WordPress mới nhất (và bạn phải luôn luôn làm điều đó vì lý do bảo mật).


1
Bạn có thể kiểm tra phiên bản MySQL của mình thông qua dòng lệnh với "mysql -V"
Edd Smith

2

Vì vậy, tôi đã giải quyết theo cách này, từ MySQL 5.6 đến 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

(Tùy chọn) Tạo một .sql.gztệp:

$ gzip database_name.sql 

Giải trình

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

Như đã giải thích trong câu trả lời này , đây chỉ là tương đương với các tùy chọn này từ phpMyAdmin: "Hệ thống cơ sở dữ liệu hoặc máy chủ MySQL cũ hơn để tối đa hóa khả năng tương thích đầu ra với:" thả xuống chọn "MYSQL 40" .

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

Chúng tôi cần điều này, để giải quyết vấn đề này:

LRI 1064 (42000) ở dòng 18: Bạn có lỗi trong cú pháp SQL của mình; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết đúng cú pháp để sử dụng gần 'TYPE = InnoDB' ở dòng 9


1
Lưu ý nếu bạn đang sử dụng phiên bản sed của OS X : $ sed -i'' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql. Nếu bạn muốn giữ một bản sao như database_name.sql.baktrước khi thay thế sed:$ sed -i'bak' 's/TYPE=InnoDB/ENGINE=InnoDB/g' database_name.sql
Justin Fortier

bạn cũng có thể nội tuyến sed.
davidbitton

Ngoài ra nếu bạn đang chạy mysqldump trên MySQL 8, bạn cần sử dụng --compatible=ansitùy chọn
AbstractVoid

1

Tôi cũng đã trải qua vấn đề này. Giải pháp hiệu quả với tôi là mở cơ sở dữ liệu cục bộ với Sequel Pro và cập nhật Encoding and Collation thành utf8 / utf8_bin cho mỗi bảng trước khi nhập.


1

Cách dễ nhất để làm là xuất khẩu cơ sở dữ liệu của bạn để .sql, mở nó trên Notepad ++ và "Tìm kiếm và Thay thế" người utf8mb4_unicode_ciđến utf8_unicode_civà cũng có thể thay thế utf8mb4cho utf8. Cũng đừng quên thay đổi đối chiếu cơ sở dữ liệu thành utf8_unicode_ci(Hoạt động> Đối chiếu).


0

mở tệp sql trên Notepad ++ và sau ctrl + H. đó bạn đặt " utf8mb4" vào tìm kiếm và " utf8" thay thế. Vấn đề sẽ được khắc phục sau đó.


Nó nói "collation utf8 chưa biết"
Cristian Traìna
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.