Làm cách nào để chuyển đổi toàn bộ bộ ký tự và đối chiếu cơ sở dữ liệu MySQL sang UTF-8?


459

Làm cách nào tôi có thể chuyển đổi toàn bộ bộ ký tự cơ sở dữ liệu MySQL thành UTF-8 và đối chiếu thành UTF-8?


22
Để khách truy cập sau: Lưu ý các câu hỏi liên quan trong thanh bên và sử dụng utf8_unicode_ci, không utf8_general_ci.
fuxia

14
Nếu bạn muốn hỗ trợ UTF-8 đầy đủ, có lẽ bạn cũng muốn sử dụng một bộ ký tự utf8mb4thay utf8utf8chỉ hỗ trợ mặt phẳng đa ngôn ngữ cơ bản trái ngược với phạm vi đầy đủ. Nó yêu cầu MySQL 5.5.3 trở lên.
Martin Steel

4
Tôi đã quên đề cập đến trong nhận xét của tôi ở trên, nếu bạn chuyển sang utf8mb4bạn cũng sẽ cần chuyển đối chiếu sangutf8mb4_unicode_ci
Martin Steel

3
Thậm chí tốt hơn, đối chiếu utf8mb4_unicode_520_ci, hoặc bất cứ điều gì là phiên bản mới nhất có sẵn.
Rick James

@MartinSteel Tôi tin rằng đó là đối chiếu theo mặc định với bộ ký tự đó.
VaTo

Câu trả lời:


715

Sử dụng các lệnh ALTER DATABASEALTER TABLE.

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Hoặc nếu bạn vẫn đang dùng MySQL 5.5.2 trở lên không hỗ trợ UTF-8 4 byte, hãy sử dụng utf8thay vì utf8mb4:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

12
Các CONVERT TOkỹ thuật giả định rằng văn bản là chính xác được lưu trữ trong một số charset khác (ví dụ, latin1), và không đọc sai (như UTF-8 byte nhồi nhét vào cột latin1 mà không cần chuyển đổi sang latin1).
Rick James

1
Điều này xây dựng lại bảng làm cho nó không khả thi trên các hệ thống sản xuất lớn. Nếu chắc chắn rằng chỉ có các ký tự ASCII được lưu trữ trong các cột latin1, thì có thể thay đổi bảng mã / đối chiếu bảng mà không cần xây dựng lại không?
Andrew

@Andrew Các hệ thống sản xuất lớn thường có DB được nhân đôi để bảo trì.
BalusC

1
thay đổi charcter được đặt thành utf8 thay đổi kiểu dữ liệu của tôi từ văn bản sang trung gian. Nó có được mong đợi không?
Jerry

1
@Jerry Có lẽ, vì: "Nếu cột được chuyển đổi thành utf8, mỗi ký tự có thể cần tối đa ba byte, với độ dài tối đa có thể là 3 × 65,535 = 196,605 byte. Độ dài đó không vừa với byte độ dài của cột TEXT, vì vậy MySQL chuyển đổi kiểu dữ liệu thành MEDIUMTEXT, đây là loại chuỗi nhỏ nhất mà các byte có độ dài có thể ghi giá trị là 196.605. Tương tự, một cột VARCHAR có thể được chuyển đổi thành MEDIUMTEXT. " Thay đổi bộ ký tự
jabbascript

129
  1. Tạo một bản sao lưu!

  2. Sau đó, bạn cần đặt các bộ char mặc định trên cơ sở dữ liệu. Điều này không chuyển đổi các bảng hiện có, nó chỉ đặt mặc định cho các bảng mới được tạo.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. Sau đó, bạn sẽ cần chuyển đổi tập char trên tất cả các bảng hiện có và các cột của chúng. Điều này giả định rằng dữ liệu hiện tại của bạn thực sự nằm trong tập char hiện tại. Nếu các cột của bạn được đặt thành một bộ char nhưng dữ liệu của bạn thực sự được lưu trữ trong một cột khác thì bạn sẽ cần kiểm tra hướng dẫn sử dụng MySQL về cách xử lý này.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

44
Lưu ý: ALlen TABLE tablename CHARACTER SET utf8 chỉ đặt bộ char mặc định trên bảng được sử dụng cho các cột mới được tạo. Nó không chuyển đổi các cột hiện có đã có một bộ char.
tờ báo

Tôi nên đọc bản sao lưu dự phòng trước tiên ... nhưng may mắn của tôi là nó đã ở trên môi trường phát triển. Vì vậy, upvote của tôi đi đến bạn!
DominikAngerer

4
@DominikAngerer: Cái gì đã phá vỡ?
cic

16
Lưu ý rằng utf8_general_cikhông còn được khuyến nghị thực hành tốt nhất. Vì MySQL 5.5.3, bạn nên sử dụng utf8mb4chứ không phải utf8. Cả hai đều đề cập đến mã hóa UTF-8, nhưng phiên bản cũ hơn utf8có giới hạn dành riêng cho MySQL ngăn chặn việc sử dụng các ký tự được đánh số ở trên 0xFFFD.
u01jmg3

76

Trên vỏ dòng lệnh

Nếu bạn là một vỏ dòng lệnh, bạn có thể thực hiện việc này rất nhanh. Chỉ cần điền "dbname": D

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

Một lớp lót để sao chép / dán đơn giản

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

2
Bạn có thể nói chi tiết hơn về điều này tôi nhận đượcERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
steros

@ 4485670 Bạn cần chạy cái này trên shell dòng lệnh . Nếu bạn chỉ có sẵn kết nối máy khách MySQL, hãy sử dụng mã sdfor bên dưới.
Arnold Daniels

6
Mã này hoạt động rất tốt, chỉ cần nhớ thêm -h [tên máy chủ] -u [tên người dùng] -p [mật khẩu] sau khi mysql là cần thiết.
giải tán

3
Bạn có thể muốn vô hiệu hóa kiểm tra khóa ngoại trên một hệ thống thực: DB="db_name"; ( echo 'ALTER DATABASE '"$ DB"' `CHARACTER SET utf8 COLLATE utf8_general_ci; '; mysql --uuser -ppassword -hhost "$ DB" -e "SHOW TABLES" --batch --skip-cột-name | xargs -I {} echo 'SET Foreign_key_checks = 0; THAY '{}'ĐỔI BẢNG CHUYỂN ĐỔI ĐỂ THIẾT LẬP TÙY CHỌN utf8 THU THẬP utf8_general_ci; ' ) | mysql -uuser -ppassword -hhost "$ DB" `
Adam Nelson

1
Tôi đã không làm việc cho đến khi tôi sử dụng "hiển thị các bảng đầy đủ trong đó Table_Type = 'BASE TABLE'" thay vì "SHOW TABLES"
Brian Peterson

68

Bạn có thể tạo sql để cập nhật tất cả các bảng với:

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;   ",
    "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ") 
    AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = your_database_name;

Nắm bắt đầu ra và chạy nó.

Câu trả lời của Arnold Daniels ở trên thanh lịch hơn.


Tại sao bạn thêm hai truy vấn bảng thay đổi? một là không đủ?
Akshay

7
@Akshay, câu hỏi hay. Truy vấn bảng thay đổi đầu tiên đặt mặc định cho các cột mới và truy vấn bảng thay đổi thứ hai chuyển đổi các cột hiện có.
Không giới hạn trong

4
FYI: theo dev.mysql.com/doc/refman/5.5/en/alter-table.html Tài liệu MySQL, phiên bản "CHUYỂN ĐỔI ĐẾN CHARACTER" của câu lệnh ALTER thực hiện cả hai trong một bước: "Để thay đổi mặc định bảng bộ ký tự tất cả các cột ký tự (CHAR, VARCHAR, TEXT) thành một bộ ký tự mới ...
devGuy 10/03/2015

2
Tôi có lỗi này # 1054 - Cột không xác định 'webdb_playground' trong 'mệnh đề where' nhưng tôi chắc chắn db của tôi là chính xác
Yannis Dran

1
@YannisDran Tên db của bạn có thể không nằm trong một chuỗi, như vậy WHERE TABLE_SCHEMA=webdb_playgroundđã cho bạn lỗi cột không xác định nhưng WHERE TABLE_SCHEMA="webdb_playground"sẽ thành công. Một cái gì đó để thử trong trường hợp bất cứ ai khác chạy vào đó.
jabbascript

17

Trước khi tiếp tục, hãy đảm bảo rằng bạn: Đã hoàn thành sao lưu cơ sở dữ liệu đầy đủ!

Bước 1: Thay đổi cấp độ cơ sở dữ liệu

  • Xác định bộ đối chiếu và ký tự của cơ sở dữ liệu của bạn

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM 
    information_schema.SCHEMATA S
    WHERE schema_name = 'your_database_name'
    AND
    (DEFAULT_CHARACTER_SET_NAME != 'utf8'
        OR
     DEFAULT_COLLATION_NAME not like 'utf8%');
  • Sửa lỗi đối chiếu cho cơ sở dữ liệu

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Bước 2: Thay đổi cấp độ bảng

  • Xác định các bảng cơ sở dữ liệu với bộ ký tự hoặc đối chiếu không chính xác

    SELECT CONCAT(
    'ALTER TABLE ',  table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci;  ', 
    'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ')
    FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
    WHERE C.collation_name = T.table_collation
    AND T.table_schema = 'your_database_name'
    AND
    (C.CHARACTER_SET_NAME != 'utf8'
        OR
     C.COLLATION_NAME not like 'utf8%')
  • Điều chỉnh đối chiếu và ký tự của cột trong bảng

Nắm bắt đầu ra sql trên và chạy nó. (như sau)

ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

tham khảo: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+set+of+a+MyQuery+Database


1
Hiện tại tập lệnh này sử dụng 'utf8_unicode_ci' cho db nhưng 'utf8_general_ci' cho các bảng - đó có phải là chủ ý? (Tôi nghĩ cả hai nên sử dụng cùng một bộ ký tự)
gmcnaughton

stackoverflow.com/questions/10957238/ từ đã để lại câu trả lời đầy đủ hơn tại đây
VH

8

Sử dụng HeidiSQL . Nó miễn phí và là một công cụ db rất tốt.

Từ menu công cụ, nhập Trình chỉnh sửa bảng số lượng lớn

Chọn cơ sở dữ liệu đầy đủ hoặc chọn bảng để chuyển đổi,

  • đánh dấu Thay đổi đối chiếu mặc định: utf8mb4_general_ci
  • đánh dấu Chuyển đổi sang bộ ký tự: utf8

Hành hình

Điều này chuyển đổi cơ sở dữ liệu hoàn chỉnh từ latin sang utf8 chỉ trong vài giây.

Hoạt động như một bùa mê :)

HeidiSQL kết nối theo mặc định là utf8, vì vậy mọi ký tự đặc biệt bây giờ sẽ được xem là ký tự (æ ø å) và ​​không được mã hóa khi kiểm tra dữ liệu bảng.

Cạm bẫy thực sự khi chuyển từ tiếng Latin sang utf8 là đảm bảo pdo kết nối với bộ ký tự utf8. Nếu không, bạn sẽ nhận được dữ liệu rác được chèn vào bảng utf8 và dấu chấm hỏi ở khắp nơi trên trang web của bạn, khiến bạn nghĩ rằng dữ liệu bảng không phải là utf8 ...


Bạn có thể giải thích xin vui lòng? Tôi có chính xác vấn đề này - các ký tự và khoảng trắng đặc biệt xuất hiện dưới dạng dấu hỏi. Tôi đang cố gắng chuyển đổi cơ sở dữ liệu trong MAMP bằng PHPMyAdmin. Đã phát triển ngoại tuyến, bây giờ tôi phát hiện ra rằng máy chủ của mình không hỗ trợ utf8mb4. Tôi không có Windows nên không thể sử dụng HeidiSQL. Có cách nào tôi có thể đạt được điều này với PHPMyAdmin không?
RexTheRunt

thích cách này đặc biệt là bạn có rất nhiều bàn
tyan

Tôi gặp lỗi và cố gắng chuyển đổi CHARSET: Lỗi SQL (1025): Lỗi khi đổi tên ... nhưng đây là một công cụ quản lý SQL tuyệt vời!
marcolopes

Nếu bất cứ ai cần một cái nhìn tổng quan và hướng dẫn tốt cho heidisql, hãy xem bài viết này .
DougB

6

Lấy cảm hứng từ bình luận @sdfor, đây là một tập lệnh bash thực hiện công việc

#!/bin/bash

printf "### Converting MySQL character set ###\n\n"

printf "Enter the encoding you want to set: "
read -r CHARSET

# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME

# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD

DBLIST=( mydatabase1 mydatabase2 )

printf "\n"


for DB in "${DBLIST[@]}"
do
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
    mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"

echo "$DB database done..."
done

echo "### DONE ###"
exit

4

Trong trường hợp dữ liệu không nằm trong cùng một bộ ký tự, bạn có thể xem xét đoạn mã này từ http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

Nếu cột có kiểu dữ liệu không phân biệt (CHAR, VARCHAR, TEXT), nội dung của cột phải được mã hóa trong bộ ký tự cột, chứ không phải một số bộ ký tự khác. Nếu nội dung được mã hóa trong một bộ ký tự khác, trước tiên bạn có thể chuyển đổi cột để sử dụng loại dữ liệu nhị phân, sau đó sang cột không nhị phân với bộ ký tự mong muốn.

Đây là một ví dụ:

 ALTER TABLE t1 CHANGE c1 c1 BLOB;
 ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;

Đảm bảo chọn đối chiếu đúng, hoặc bạn có thể nhận được các xung đột khóa duy nhất. ví dụ Éleanore và Eleanore có thể được coi là giống nhau trong một số đối chiếu.

Qua một bên:

Tôi đã có một tình huống trong đó một số ký tự "bị hỏng" trong email mặc dù chúng được lưu trữ dưới dạng UTF-8 trong cơ sở dữ liệu. Nếu bạn đang gửi email bằng dữ liệu utf8, bạn cũng có thể muốn chuyển đổi email của mình để gửi trong UTF8.

Trong PHPMailer, chỉ cần cập nhật dòng này: public $CharSet = 'utf-8';


4

Đối với cơ sở dữ liệu có số lượng bảng nhiều, bạn có thể sử dụng tập lệnh php đơn giản để cập nhật bộ ký tự của cơ sở dữ liệu và tất cả các bảng bằng cách sử dụng sau:

$conn = mysqli_connect($host, $username, $password, $database);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);

$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables  = mysqli_fetch_all($show_tables_result);

foreach ($tables as $index => $table) {
  $alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci";
  $alter_table_result = mysqli_query($conn, $alter_table_sql);
  echo "<pre>";
  var_dump($alter_table_result);
  echo "</pre>";
}

Chúng ta chạy tập lệnh này từ đâu?
Yannis Dran

1
@YannisDran Không thành vấn đề, miễn là IP mà bạn thực thi nó có quyền truy cập vào cơ sở dữ liệu. Hãy chắc chắn rằng bạn đã sao lưu trước!
Dan Lucas

Tốt, và làm thế nào để chúng ta chạy nó? Chúng ta có phải tải nó lên máy chủ và sau đó chạy enter đường dẫn đến vị trí của nó không?
Yannis Dran

4
DELIMITER $$  

CREATE PROCEDURE `databasename`.`update_char_set`()  

BEGIN  
 DECLARE done INT DEFAULT 0;  
 DECLARE t_sql VARCHAR(256);  
 DECLARE tableName VARCHAR(128);  
 DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';  
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  
 OPEN lists;  
 FETCH lists INTO tableName;  
 REPEAT  
    SET @t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');  
    PREPARE stmt FROM @t_sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
 FETCH lists INTO tableName;  
 UNTIL done END REPEAT;  
 CLOSE lists;  
END$$  

DELIMITER ;  

CALL databasename.update_char_set();

Cảm ơn, đây là một trong số ít câu trả lời thực sự chỉ ra cách thực hiện cho toàn bộ cơ sở dữ liệu (tức là mỗi bảng). Làm việc như người ở.
Machisuji

3
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

3

Cách an toàn nhất là sửa đổi các cột trước thành loại nhị phân và sau đó sửa đổi lại thành loại bằng cách sử dụng bộ ký tự mong muốn.

Mỗi loại cột có loại nhị phân tương ứng, như sau:

  1. CHAR => BINary
  2. VĂN => BLOB
  3. TINYTEXT => TINYBLOB
  4. TRUNG TÂM => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR => BIỂU TƯỢNG

Ví dụ.:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;

Tôi đã thử trong một số bảng latin1 và nó giữ tất cả các dấu phụ.

Bạn có thể trích xuất truy vấn này cho tất cả các cột thực hiện việc này:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');

Sau khi bạn làm điều này trên tất cả các cột của bạn, sau đó bạn làm điều đó trên tất cả các bảng:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Để tạo truy vấn này cho tất cả các bảng của bạn, hãy sử dụng truy vấn sau:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');

Và bây giờ bạn đã sửa đổi tất cả các cột và bảng của mình, hãy làm tương tự trên cơ sở dữ liệu:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;

1

Nếu bạn không thể chuyển các bảng của mình để chuyển đổi hoặc bảng của bạn luôn được đặt thành một số bộ ký tự không phải là utf8, nhưng bạn muốn utf8, cách tốt nhất của bạn có thể là xóa sạch nó và bắt đầu lại và chỉ định rõ ràng:

create database database_name character set utf8;

0

Giải pháp duy nhất hiệu quả với tôi: http://docs.moodle.org/23/en/Converting_your_MyQuery_database_to_UTF8

Chuyển đổi cơ sở dữ liệu chứa các bảng

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

0

thay đổi bảng tên_bảng charset = 'utf8';

Đây là một truy vấn đơn giản tôi có thể sử dụng cho trường hợp của mình, bạn có thể thay đổi tên_bảng theo yêu cầu của bạn.


Thông thường một câu trả lời nên được kèm theo một số giải thích về những gì bạn đề nghị làm.
RiggsFolly

0

Để thay đổi mã hóa bộ ký tự thành UTF-8 cho chính cơ sở dữ liệu, hãy nhập lệnh sau tại dấu nhắc mysql>. Thay thế DBNAME bằng tên cơ sở dữ liệu:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

0

Bạn cũng có thể DB tool Navicat, công cụ này dễ dàng hơn.

  • Siva.

Nhấp chuột phải vào Cơ sở dữ liệu của bạn và chọn Thuộc tính DB & Thay đổi như bạn muốn trong Thả xuống

nhập mô tả hình ảnh ở đây


0

Giải pháp dòng lệnh và loại trừ lượt xem

Tôi chỉ đơn giản là hoàn thành câu trả lời của @ Jasny cho những người khác thích @Brianvà tôi có quan điểm trong cơ sở dữ liệu của chúng tôi.

Nếu bạn có một lỗi như thế này:

ERROR 1347 (HY000) at line 17: 'dbname.table_name' is not of type 'BASE TABLE'

Đó là bởi vì bạn có thể có quan điểm và bạn cần loại trừ chúng. Nhưng khi cố gắng loại trừ chúng, MySQL trả về 2 cột thay vì 1.

SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE';
-- table_name1  BASE TABLE
-- table_name2  BASE TABLE

Vì vậy, chúng ta phải điều chỉnh lệnh của Jasny awkđể chỉ trích xuất cột thứ 1 chứa tên bảng.

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names \
    | awk '{print $1 }' \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

Một lớp lót để sao chép / dán đơn giản

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names | awk '{print $1 }' | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

-1

Để thay đổi mã hóa bộ ký tự thành UTF-8, hãy làm theo các bước đơn giản trong PHPMyAdmin

  1. Chọn cơ sở dữ liệu của bạn SS

  2. Đi đến hoạt động SS

  3. Trong tab thao tác, trên menu thả xuống đối chiếu dưới cùng, chọn bạn muốn mã hóa tức là (utf8_general_ci), đồng thời kiểm tra hộp kiểm (1) thay đổi tất cả các đối chiếu bảng, (2) Thay đổi tất cả các đối chiếu cột của bảng. và nhấn Go.

SS

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.