Bộ ký tự mysqli utf8mb4

Bạn có đang sử dụng bộ ký tự

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 của MySQL trong cơ sở dữ liệu của mình không?

UTF-8

có thể đại diện cho mọi ký hiệu trong bộ ký tự Unicode, nằm trong khoảng từ U+000000 đến U+10FFFF. Đó là 1.114.112 biểu tượng có thể. (Không phải tất cả các điểm mã Unicode này đều đã được gán ký tự, nhưng điều đó không ngăn UTF-8 có thể mã hóa chúng. )

UTF-8 là mã hóa có độ rộng thay đổi; . Các biểu tượng có giá trị điểm mã số thấp hơn được mã hóa bằng ít byte hơn. Bằng cách này, UTF-8 được tối ưu hóa cho trường hợp phổ biến khi các ký tự ASCII và các ký tự khác (có điểm mã nằm trong khoảng từ U+000000 đến U+00FFFF) được sử dụng — trong khi vẫn cho phép các ký hiệu thiên văn (có điểm mã nằm trong khoảng từ U+010000 đến U

MySQL của # For each tableREPAIR TABLE table_name;OPTIMIZE TABLE table_name;9

Trong một thời gian dài, tôi đã sử dụng bộ ký tự

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 của MySQL cho cơ sở dữ liệu, bảng và cột, giả sử nó được ánh xạ tới mã hóa UTF-8 được mô tả ở trên. Bằng cách sử dụng
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9, tôi có thể lưu trữ bất kỳ biểu tượng nào tôi muốn trong cơ sở dữ liệu của mình — hoặc tôi nghĩ vậy

Trong khi viết về mã hóa ký tự bên trong của JavaScript, tôi nhận thấy rằng không có cách nào để chèn ký hiệu U+1D306 TETRAGRAM FOR CENTER (

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
4) vào cơ sở dữ liệu MySQL đằng sau trang web này. Cột tôi đang cố cập nhật có đối chiếu
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
5 và bộ ký tự kết nối được đặt thành
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9

________số 8_______

Nội dung bị cắt bớt ở phần đầu tiên , trong trường hợp này là

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
4 — vì vậy, việc cố gắng chèn
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
8 thực tế lại được chèn vào
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
9, dẫn đến mất dữ liệu (và có thể gây ra các vấn đề về bảo mật; xem bên dưới). MySQL cũng trả lại một thông báo cảnh báo

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Hóa ra bộ ký tự

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 của MySQL chỉ thực hiện một phần mã hóa UTF-8 thích hợp. Nó chỉ có thể lưu trữ các ký hiệu được mã hóa UTF-8 bao gồm một đến ba byte;

Vì các ký hiệu thiên thể (có các điểm mã nằm trong khoảng từ U+010000 đến U+10FFFF), mỗi ký hiệu bao gồm bốn byte trong UTF-8, nên bạn không thể lưu trữ chúng bằng triển khai

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 của MySQL

Điều này không chỉ ảnh hưởng đến ký tự

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
4 mà còn ảnh hưởng đến các ký hiệu quan trọng hơn như U+01F4A9 PILE OF POO (
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
8). Tổng cộng, đó là 1.048.575 điểm mã có thể bạn không thể sử dụng. Trên thực tế,
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 của MySQL chỉ cho phép bạn lưu trữ 5. 88% (
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
5) của tất cả các điểm mã Unicode có thể. UTF-8 thích hợp có thể mã hóa 100% tất cả các điểm mã Unicode

Như đã trình bày ở trên, hành vi này có thể dẫn đến mất dữ liệu, nhưng tệ hơn là có thể dẫn đến các lỗ hổng bảo mật. Dưới đây là một số ví dụ, tất cả đều được phát hiện sau khi xuất bản bài viết này

  • Lỗ hổng chèn đối tượng PHP trong WordPress <3. 6. 1, dẫn đến thực thi mã từ xa kết hợp với một số plugin WordPress nhất định
  • Bỏ qua xác thực email trong Phabricator
  • XSS được lưu trữ trong WordPress 4. 1. 2
  • Thực thi lệnh từ xa trong Joomla. CMS

TL; DR Mã hóa

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 của MySQL được đặt tên một cách khó hiểu, vì nó khác với mã hóa UTF-8 thích hợp. Nó không cung cấp hỗ trợ Unicode đầy đủ, điều này có thể dẫn đến mất dữ liệu hoặc lỗ hổng bảo mật

MySQL của $ mysqlcheck -u root -p --auto-repair --optimize --all-databases0

May mắn thay, MySQL 5. 5. 3 (phát hành vào đầu năm 2010) đã giới thiệu một mã hóa mới có tên là

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 ánh xạ tới đúng UTF-8 và do đó hỗ trợ đầy đủ Unicode, bao gồm các ký hiệu thiên thể

Chuyển từ # For each tableREPAIR TABLE table_name;OPTIMIZE TABLE table_name;9 của MySQL sang $ mysqlcheck -u root -p --auto-repair --optimize --all-databases0

Bước 1. Tạo bản sao lưu

Tạo bản sao lưu của tất cả cơ sở dữ liệu trên máy chủ bạn muốn nâng cấp. An toàn là trên hết

Bước 2. Nâng cấp máy chủ MySQL

Nâng cấp máy chủ MySQL lên v5. 5. 3+ hoặc yêu cầu quản trị viên máy chủ của bạn làm điều đó cho bạn

Bước 3. Sửa đổi cơ sở dữ liệu, bảng và cột

Thay đổi bộ ký tự và thuộc tính đối chiếu của cơ sở dữ liệu, bảng và cột để sử dụng

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 thay vì
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 hoàn toàn tương thích ngược với
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 nên không xảy ra mojibake hoặc các hình thức mất dữ liệu khác. (Nhưng bạn có, phải không?)

Bước 4. Kiểm tra độ dài tối đa của cột và khóa chỉ mục

Đây có lẽ là phần tẻ nhạt nhất trong toàn bộ quá trình nâng cấp

Khi chuyển đổi từ

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 sang
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0, độ dài tối đa của một cột hoặc khóa chỉ mục không thay đổi theo byte. Do đó, nó nhỏ hơn về ký tự, vì độ dài tối đa của một ký tự hiện là bốn byte thay vì ba

Ví dụ: cột

java.sql.SQLException: Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
7 có thể chứa tối đa 255 byte, tương ứng với 85 ký tự ba byte hoặc 63 ký tự bốn byte. Giả sử bạn có một cột
java.sql.SQLException: Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
7 sử dụng
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 nhưng phải có thể chứa nhiều hơn 63 ký tự. Với yêu cầu này, bạn không thể chuyển đổi cột này thành
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 trừ khi bạn cũng thay đổi loại dữ liệu thành loại dài hơn, chẳng hạn như
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/[dbName]?useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ci", "root", "root");
1 — bởi vì nếu bạn cố điền cột đó bằng các ký tự bốn byte, bạn chỉ có thể

Điều tương tự cũng xảy ra với các khóa chỉ mục. Công cụ lưu trữ

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/[dbName]?useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ci", "root", "root");
2 có độ dài chỉ mục tối đa là 767 byte, vì vậy đối với cột
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 hoặc
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0, bạn có thể lập chỉ mục tối đa lần lượt là 255 hoặc 191 ký tự. Nếu bạn hiện có
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 cột có chỉ mục dài hơn 191 ký tự, bạn sẽ cần lập chỉ mục một số lượng ký tự nhỏ hơn khi sử dụng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0. (Vì điều này, tôi đã phải thay đổi một số cột
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/[dbName]?useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ci", "root", "root");
7 được lập chỉ mục thành
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/[dbName]?useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ci", "root", "root");
8. )

Phần 10. 1. 11 của MySQL 5. 5 Tài liệu tham khảo có thêm một số thông tin về điều này

Bước 5. Sửa đổi bộ ký tự kết nối, máy khách và máy chủ

Trong mã ứng dụng của bạn, hãy đặt bộ ký tự kết nối thành

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0. Điều này có thể được thực hiện bằng cách thay thế bất kỳ biến thể nào của
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
00 bằng
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
01. Nếu câu lệnh
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
02 cũ của bạn chỉ định đối chiếu, hãy đảm bảo thay đổi cả điều đó, e. g.
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
03 trở thành
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
04

Đảm bảo cũng đặt bộ ký tự máy khách và máy chủ. Tôi có phần sau trong tệp cấu hình MySQL của mình (

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
05)

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

Bạn có thể dễ dàng xác nhận các cài đặt này hoạt động chính xác

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

Như bạn có thể thấy, tất cả các tùy chọn có liên quan được đặt thành

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0, ngoại trừ tùy chọn đó phải là
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
08 trừ khi bạn đang sử dụng hệ thống tệp hỗ trợ các ký tự được mã hóa UTF-8 nhiều byte trong tên tệp và
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
09 luôn là
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 và

Ghi chú. Bộ ký tự và đối chiếu mặc định cũng có thể được cấu hình ở một số cấp độ khác

Bước 6. Sửa chữa và tối ưu hóa tất cả các bảng

Sau khi nâng cấp máy chủ MySQL và thực hiện các thay đổi cần thiết được giải thích ở trên, hãy đảm bảo sửa chữa và tối ưu hóa tất cả các cơ sở dữ liệu và bảng. Tôi đã không làm điều này ngay sau khi nâng cấp (tôi không nghĩ là cần thiết, vì thoạt nhìn mọi thứ có vẻ hoạt động tốt), và gặp phải một số lỗi kỳ lạ trong đó các câu lệnh

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
11 không có bất kỳ tác dụng nào, mặc dù không

Bạn có thể chạy các truy vấn MySQL sau cho mỗi bảng mà bạn muốn sửa chữa và tối ưu hóa

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;

May mắn thay, điều này có thể dễ dàng được thực hiện trong một lần sử dụng tiện ích dòng lệnh

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
12

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases

Điều này sẽ nhắc mật khẩu của người dùng root, sau đó tất cả các bảng trong tất cả các cơ sở dữ liệu sẽ được sửa chữa và tối ưu hóa

Tóm lược

Không bao giờ sử dụng

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 trong MySQL — thay vào đó hãy luôn sử dụng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0. Việc cập nhật cơ sở dữ liệu và mã của bạn có thể mất một chút thời gian, nhưng nó chắc chắn đáng để nỗ lực. Tại sao bạn lại tự ý giới hạn tập hợp các ký hiệu có thể được sử dụng trong cơ sở dữ liệu của mình? . Làm điều đúng đắn và sử dụng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0. 🍻

Về tôi

Chào bạn. Tôi là Mathias. Tôi làm việc trên Chrome DevTools và công cụ JavaScript V8 tại Google. HTML, CSS, JavaScript, Unicode, hiệu suất và bảo mật khiến tôi phấn khích. Theo dõi tôi trên Twitter, Mastodon và GitHub

Bình luận

David Higgins đã viết trên.

Mathias viết hay đấy. Bạn cũng có thể thoát các ký hiệu Unicode thành một số loại phiên bản đã được làm sạch trước khi thêm chúng vào cơ sở dữ liệu. e. g.

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
4 →
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
17

Mathias đã viết trên.

Điều đó đi ngược lại các nguyên tắc bình thường hóa. Và nếu bạn muốn sử dụng dữ liệu ở định dạng khác không hỗ trợ các thực thể ký tự HTML thì sao?

maxw3st đã viết trên.

Cảm ơn bạn rất nhiều vì tài liệu này kỹ lưỡng. Có vẻ như việc cập nhật các bảng và cơ sở dữ liệu hiện tại của tôi sẽ rất khó khăn, nhưng việc thêm các bảng và cơ sở dữ liệu mới sẽ rất nhanh sau khi tôi làm theo hướng dẫn kết nối/máy khách/máy chủ và cập nhật các tệp cấu hình. Nói chung, điểm tuyệt vời về việc tăng bộ ký tự có sẵn. Cảm ơn bạn

Tôi Và Tôi đã viết trên.

Mục đích của

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
18 là gì?

Tại sao bạn sử dụng

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
19, vốn đã là giá trị mặc định vì
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
20?

Mathias đã viết trên.

Mặc dù các câu hỏi của bạn có thể hơi nằm ngoài phạm vi của bài viết này, nhưng tôi sẽ trả lời chúng theo sự hiểu biết tốt nhất của tôi

Mục đích của

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
18 là gì?

khiến máy chủ bỏ qua thông tin bộ ký tự do máy khách gửi (e. g. nếu khách hàng yêu cầu kết nối trong

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9, nó vẫn sẽ sử dụng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0). Bằng cách sử dụng nó, bạn có thể yên tâm rằng bộ ký tự máy chủ mặc định sẽ được sử dụng mọi lúc

Tại sao bạn sử dụng

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
19, vốn đã là giá trị mặc định vì
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
20?

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
02 cho biết bộ ký tự mà máy khách sẽ sử dụng để gửi các câu lệnh SQL đến máy chủ, tôi. e. bộ ký tự kết nối. đặt bộ ký tự máy chủ. Để sử dụng đúng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0, bạn cần đảm bảo rằng máy khách, máy chủ và kết nối đều được đặt thành
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0

Đó là sự hiểu biết của tôi về các cài đặt này. Nếu bạn nghĩ rằng điều này là sai, tôi đánh giá cao một sự làm rõ. Thanks

Tôi Và Tôi đã viết trên.

Bạn đã kiểm tra tác dụng của

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
18 chưa? . 1. x khách hàng của tôi vẫn có thể thay đổi bộ ký tự, bất kể tôi đã viết tùy chọn này như thế nào (với
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
32, với
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
33, với
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
34 thay vì
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
35). Và tại sao khách hàng không thể thay đổi bộ ký tự cho kết nối của chính mình?

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
28 không phải là giá trị duy nhất bạn có thể đặt (không có
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
37) trong ____12_______38 (vâng, ____12_______39 cũng vậy, nhưng bây giờ nó không quan trọng). Đây cũng là giá trị mặc định cho tất cả các cài đặt bộ ký tự khác mà bạn không thay đổi rõ ràng (trong phiên của khách hàng, cho cơ sở dữ liệu, bảng, cột, v.v. ). Nói cách khác, (gần như) tất cả các
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
40 khác sẽ kế thừa từ giá trị này. Vì vậy, giá trị mặc định cho kết nối của khách hàng (
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
41,
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
42 và
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
43) sẽ luôn là giá trị này. Bạn không cần sử dụng
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
37 trừ khi bạn muốn giá trị mặc định của kết nối khách hàng của bạn khác với giá trị được xác định trong
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
28

Mathias đã viết trên.

Đặt

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
18 (hoặc sử dụng
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
47) là cách duy nhất tôi có thể khiến
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
48 hiển thị dưới dạng
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
49 thay vì
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
50 khi thực hiện truy vấn
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
51. Trừ khi có cách tốt hơn để đạt được hiệu ứng tương tự, tôi e rằng không thể bỏ qua cài đặt này

Cảm ơn bạn đã chỉ ra cài đặt

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
37 là không cần thiết — Tôi đã xóa nó ngay bây giờ. Vui lòng cho tôi biết nếu ví dụ
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
05 có thể được tối ưu hóa hơn nữa

Tôi Và Tôi đã viết trên.

Để đặt đối chiếu của kết nối thành

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
54 thay vì
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
55, tôi có thể thực hiện việc này thành công bằng cách sử dụng
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
56. Nhưng bạn chỉ cần sử dụng
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
54 cho
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
58, nếu không, bạn có thể sử dụng
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
55 nhanh hơn như hướng dẫn nói. https. // nhà phát triển. mysql. com/doc/refman/5. 5/en/charset-unicode-sets. html

Để sử dụng đúng

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0, bạn cần đảm bảo rằng máy khách, máy chủ và kết nối đều được đặt thành
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0

Không thật sự lắm. Tất nhiên khách hàng phải nói UTF-8. Đối với MySQL, bạn chỉ cần hai thứ. cài đặt cho kết nối máy khách của bạn và cài đặt cho các trường chuỗi.

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
28 chỉ là giá trị mặc định để tạo cơ sở dữ liệu nếu bạn không đặt bộ ký tự trong câu lệnh
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
63. Giá trị của cơ sở dữ liệu chỉ là giá trị mặc định cho các bảng của nó nếu bạn không đặt nó trong
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
64. Giá trị của bảng chỉ là giá trị mặc định cho các trường chuỗi nếu bạn không nói điều gì đó đặc biệt cho các trường. Chỉ bây giờ cả bộ ký tự và đối chiếu đều có mục đích thực sự để lưu trữ các giá trị và so sánh các chuỗi, v.v. Điểm thứ hai là giá trị của kết nối. MySQL cần nó để giải mã đầu vào của bạn một cách chính xác và để mã hóa kết quả. (Có thể bỏ qua mã hóa lại nếu kết nối và các trường sử dụng cùng một giá trị bộ ký tự. ) Xem ba chương phụ đầu tiên của https. // nhà phát triển. mysql. com/doc/refman/5. 5/en/cú pháp bảng mã. html (các câu chính nằm ở cuối các chương này) và https. // nhà phát triển. mysql. com/doc/refman/5. 5/en/kết nối bộ ký tự. html

kết luận của tôi là. bạn có thể để nguyên các giá trị mặc định của máy chủ. Chỉ cần chỉ định giá trị cho các trường của bạn (hoặc giá trị mặc định cho bảng hoặc cơ sở dữ liệu của bạn nếu bạn không muốn đặt giá trị này theo từng trường). Và sử dụng

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
02 hoặc
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
66 trong PHP hoặc một cái gì đó tương tự sau mỗi lần kết nối với máy chủ MySQL. Đó là tất cả những gì bạn cần. Đừng dựa vào các giá trị mặc định của máy chủ

Patricio đã viết trên.

Bài viết rất hay Mathias, điều này cũng làm tôi ngạc nhiên một thời gian trước. Ai đã quyết định đặt tên cho bộ ký tự kia là

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9?. s

Tôi nghĩ sẽ an toàn hơn nhiều nếu không tin tưởng bất kỳ bộ ký tự mặc định nào được đặt trong cấu hình máy chủ và đảm bảo rằng ứng dụng của bạn đang đặt chính xác, bất cứ khi nào ứng dụng tạo/sửa đổi bảng và cơ sở dữ liệu cũng như mở các kết nối mới

Peter van Dijk đã viết trên.

Nếu bạn thực sự cần

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
68 sau những thay đổi này, thì đó là lỗi và bạn nên báo cáo

Binyamin đã viết trên.

@Mathias, tôi đã làm theo các bước của bạn để thay đổi MySQL 5. 5. 25 thành

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0, nhưng tiếc là SQL trả về

Lỗi #1064 – Bạn có lỗi trong cú pháp SQL của mình;

…khi tôi chạy truy vấn

ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

…và với

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
71, toàn bộ trang web trả về Lỗi 500; . Nhật ký MySQL không hiển thị bất kỳ lỗi nào

Với

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 trang web hoạt động tốt. Bất kỳ đề xuất? . 5. 25a

Mathias đã viết trên.

Lỗi 500 rất có thể không liên quan gì đến bản thân MySQL, mà liên quan đến mã phía máy chủ kết nối với nó hoặc ở nơi khác trong mã của bạn. Hãy xem xét kỹ hơn các trang dẫn đến lỗi và cố gắng tìm hiểu xem chúng đang làm gì khác với các trang khác

Tôi đang sử dụng MySQL 5. 5. 25a cũng vậy, với các cài đặt chính xác này và mọi thứ đều hoạt động hoàn hảo

Binyamin đã viết trên.

Nó đã hoạt động sau khi phát hiện ra một lỗi Webmin với

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
18 và sửa nó với
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
74

Lạ là máy chủ cũng trả về lỗi 500 vì một số loại hàng MySQL là

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
75. Sau khi tôi thay đổi loại thành
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
76, lỗi đã biến mất và mã hóa
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 hiện hoạt động tốt

Mathias đã viết trên.

Vấn đề

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
78 có lẽ là kết quả của những gì được mô tả trong, phải không?

Binyamin đã viết trên.

Tôi không chắc về điều đó, vì trong một số trường hợp, hàng

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
78 sẽ gây ra Lỗi 500 ngay cả khi hàng đó có giá trị ký tự nhỏ và thay vào đó, việc sử dụng
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/[dbName]?useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ci", "root", "root");
1 sẽ khắc phục lỗi đó. Có lẽ nó liên quan đến MySQL 5. 5. lỗi 25

ArunMohan đã viết trên.

Tôi vẫn nhận được

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
81

Nhưng tôi có thể chèn các ký tự đó thông qua ứng dụng khách MySQL của mình (SqlYog)…

Richard đã viết trên.

Điều gì về hiệu suất và sử dụng bộ nhớ?

Mathias đã viết trên.

Tôi không biết về việc sử dụng bộ nhớ, nhưng hiệu suất của

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 chậm hơn so với 3 byte của
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9. Tôi nghi ngờ sự khác biệt là không đáng kể, mặc dù tôi muốn xem một số con số

Jon T. đã viết trên.

Bạn có đang sử dụng bộ ký tự

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 của MySQL trong cơ sở dữ liệu của mình không?

Neil Martin đã viết trên.

Tôi đã tìm thấy nhiều tài nguyên tuyên bố cung cấp các giải pháp để sử dụng

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 với MySQL, nhưng tất cả chúng đều không đầy đủ. Tôi đã đọc bài viết của bạn và áp dụng các thay đổi cấu hình được đề xuất và mọi thứ đã hoạt động. Công việc tuyệt vời;

Deron Meranda đã viết trên.

Nếu bạn đang sử dụng Python với mô-đun MySQLpy phổ biến để kết nối cơ sở dữ liệu của mình, bạn sẽ cần áp dụng một bản vá nhỏ cho mã nguồn python để nó nhận ra bộ ký tự

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 mới. Cho đến khi bản vá này chính thức được thực hiện trong mã ngược dòng, hãy xem bản vá Pastebin nhỏ

Roland Franssen đã viết trên.

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
87 làm cho nó hoạt động với tôi trên MySQL 5. 5. 28

CodeKingPlusPlus đã viết trên.

Còn việc thay đổi cài đặt đối chiếu cho JDBC thì sao? . Tôi có thể chạy các truy vấn tốt bên trong cơ sở dữ liệu của mình nhưng tôi nhận được ngoại lệ sau từ mã Java của mình

java.sql.SQLException: Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='

Tôi không thể tìm ra cách thay đổi

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
88 thành
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
89

Chuỗi kết nối của tôi là

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/[dbName]?useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ci", "root", "root");

Bạn đã giải được

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
90 của mình chưa?

Robert đã viết trên.

Cảm ơn bạn rất nhiều, tôi đã tìm kiếm một giải pháp trong gần một năm

Pawel đã viết trên.

Nếu tôi tình cờ gặp một đống POO cần được chèn vào cơ sở dữ liệu, tôi sẽ nhớ bài viết của bạn. )

Julia Neystadt đã viết về.

Cảm ơn rất nhiều cho bài viết của bạn. Thật không may, tôi đã làm theo tất cả các hướng dẫn và tôi vẫn gặp sự cố

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
0

Đây là vấn đề tương tự được báo cáo trước đó

Bất kỳ ý tưởng?

Mathias đã viết trên.

và Bạn có thể nhận được ngoại lệ đó vì trình điều khiển JDBC (kết nối giữa Java và cơ sở dữ liệu của bạn) không nhận ra bộ ký tự

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0. Hãy thử sử dụng trình điều khiển JDBC có hỗ trợ
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 — Trình kết nối MySQL/J 5. 1. 13 (hoặc phiên bản mới hơn) chẳng hạn

Julia Neystadt đã viết về.

Cảm ơn rất nhiều vì đã trả lời nhanh. Thật không may, điều này không giúp tôi. Trình kết nối MySQL của tôi là 5. 1. 18

Nhưng tôi đã chú ý rằng phiên bản DB của tôi là 5. 5. 19-nhật ký. Mặt khác, tất cả các định nghĩa

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 được đặt chính xác

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
1

Giúp đỡ của bạn được đánh giá rất cao

Julia

Julia Neystadt đã viết về.

Tôi đã giải quyết vấn đề của mình bằng cách nâng cấp phiên bản MySQL Connector/J lên 5. 1. 22

Michael đã viết trên.

Cảm ơn vì bài viết của bạn, nó đã giúp tôi rất nhiều

Đây là những suy nghĩ của tôi và một số thông tin bổ sung có thể hữu ích và. http. //thông tin. michael-simon. eu/2013/01/21/java-mysql-and-multi-byte-utf-8-support/

Bạn phải có

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
94 trong
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
38 và
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
96 trong kết nối JDBC của mình. Tùy thuộc vào phiên bản Trình kết nối MySQL/J của bạn, bạn cũng cần phải có
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
97 hoặc không, xem bài viết của tôi

Itay đã viết trên.

Cảm ơn rất nhiều vì bài viết tuyệt vời. Tôi đã làm tất cả các bước nhưng tôi vẫn thấy các dấu chấm hỏi nơi các ký tự 4 byte sẽ hiển thị. Tôi đang thiếu gì?

Jamie đã viết trên.

Tôi nhận thấy rằng phpMyAdmin không xử lý được

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0. Các ký tự 4 byte hiện có hiển thị dưới dạng dấu chấm hỏi và cố gắng chèn ký tự 4 byte dường như chèn bốn dấu hỏi thực tế vào cơ sở dữ liệu. Bật nhật ký
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
99 và xem phpMyAdmin đang làm gì, tôi nhận thấy nó đang đặt bộ ký tự thành
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 mỗi lần. Nó được mã hóa cứng trong dòng 1303 của
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
01

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
2

Thay đổi nó thành

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 sẽ giải quyết được vấn đề, mặc dù đây là một bản hack nhưng bạn cần nhớ thực hiện thay đổi này mỗi khi bạn nâng cấp phpMyAdmin

Ngoài ra, nếu bạn muốn chắc chắn sắp xếp chính xác các kết quả, bạn có thể đặt đối chiếu kết nối Máy chủ trên trang đầu của phpMyAdmin thành

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
49

Mathias đã viết trên.

Thanks. Bạn có thể muốn thêm thông tin đó vào vé lỗi phpMyAdmin tương ứng. http. //nguồnforge. net/p/phpmyadmin/bugs/3619/

Paul đã viết trên.

Ở đầu bài viết của bạn, bạn thực sự nên đề cập đến phiên bản MySQL áp dụng cho phiên bản này vì phiên bản trong Debian Squeeze là 5. 1 và điều đó quá cũ để có

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 rõ ràng. Đã dành nhiều thời gian để viết một chương trình để cập nhật các bảng MySQL của tôi, v.v. và sau đó thấy rằng tôi không thể không cập nhật gói. bài viết của bạn là công cụ tốt mặc dù. . -)

cmr đã viết trên.

Xin chào các bạn, tôi đã thử ở trên. Tôi đã khởi động lại máy chủ MySQL nhưng đầu ra vẫn như thế này

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
3

Đây là những gì

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
05 của tôi trông giống như

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
4

Tôi đã xem cài đặt máy chủ mặc định và không thấy đề cập đến các biến trên đối với tệp

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
38

Tôi không thể lưu

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
4 nhưng tôi có thể lưu các ký tự như
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
08,
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
09 và
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
10

Mathias đã viết trên.

Bạn có chắc chắn rằng tệp

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
38 mà bạn đang chỉnh sửa là tệp được tải không?

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
5

Trên máy của tôi, bản in này

Các tùy chọn mặc định được đọc từ các tệp sau theo thứ tự nhất định

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
6

Đảm bảo tệp cấu hình bạn đang lưu vào được liệt kê. Ngoài ra, hãy kiểm tra tất cả các tệp khác được tải và đảm bảo rằng chúng không ghi đè cài đặt của bạn

cmr đã viết trên.

Tôi đã chuyển

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
38 sang
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
13 và nó hiện đang hoạt động. Cảm ơn rất nhiều

Cập nhật. Tôi dường như không thể thêm ký tự vào cơ sở dữ liệu

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
7

Câu lệnh sql

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
8

Tôi đã thử chạy lệnh này

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
9

Đầu ra cho biết "0 hàng bị ảnh hưởng"

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
0

Tôi đoán rằng

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 không được áp dụng cho hàng của tôi

Nhưng khi tôi chạy như sau

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
1

Điều gì khác có thể xảy ra?

Cập nhật. Đã tìm thấy nó. tôi đã mất tích

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
2

Cảm ơn vì bài viết tuyệt vời

Binyamin đã viết trên.

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
15 trong MySQL 5. 5. 3 và
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 được hỗ trợ kể từ MySQL 5. 5. 3

Tại sao bạn lại sử dụng

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
15 trong
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
18 và
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
19?

Mathias đã viết trên.

Tôi nghĩ rằng chỉ có tùy chọn dòng lệnh bị xóa, không phải biến. Một thử nghiệm nhanh xác nhận điều này. xóa các biến này khỏi tệp cấu hình sẽ ảnh hưởng đến kết quả

Với các cài đặt này

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

…Tôi nhận được những kết quả này

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
4

Không có phần

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
18 và
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
19 thì kết quả đã khác

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
5

Mihai đã viết trên.

bài viết rất tốt. Chúng tôi đã biết về công thức pha chế này có tên là

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9, nhưng bạn cung cấp cơ chế để giải quyết vấn đề này một cách chính xác

Jef Vlamings đã viết trên.

Thanks. Chắc chắn là lời giải thích rõ ràng nhất về cách định cấu hình

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 ngoài kia

Steve Hibbert đã viết về.

Về nơi duy nhất tôi có thể tìm thấy có cách chính xác để thiết lập

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
48 trong 5. 6. 15. Cảm ơn rất nhiều

HS viết tiếp.

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
6

Đó là những gì tôi có trong

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
38 dưới
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
26. Tôi đang thiếu một cái gì đó hoặc làm điều gì đó sai? . 6. 16-nhật ký

HS viết tiếp.

Sau khi suy nghĩ rất nhiều, đây là những cài đặt tốt nhất mà tôi có thể tìm ra để chạy mọi thứ với

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
7

Khi chạy

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
8

tôi hiểu rồi

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
9

câu hỏi của tôi là

  • Làm cách nào tôi cũng có thể đặt hệ thống sử dụng
    $ mysqlcheck -u root -p --auto-repair --optimize --all-databases
    0? . 5 và WHM. Hoặc nó sẽ là một ý tưởng tồi?
  • Có điều gì khác mà tôi nên làm để buộc hoàn toàn sử dụng
    $ mysqlcheck -u root -p --auto-repair --optimize --all-databases
    0 không?
  • Có điều gì sai với đoạn mã trên vào ngày
    mysql> SHOW WARNINGS;
    +---------+------+------------------------------------------------------------------------------+
    | Level | Code | Message |
    +---------+------+------------------------------------------------------------------------------+
    | Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
    +---------+------+------------------------------------------------------------------------------+
    1 row in set (0.00 sec)
    38 không?

Thanks

P. S. Với cấu hình trên trong

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
38, tôi không nhận được BẤT KỲ loại cảnh báo hay lỗi nào nữa khi kiểm tra thông báo lỗi MySQL. Một lưu ý nữa là mình đang chạy MySQL mới nhất từ ​​WHM. 5. 6. Máy chủ cộng đồng MySQL 16-log (GPL)

Mathias đã viết trên.

Tất cả những câu hỏi đó đã được trả lời trong bài viết trên. Tôi khuyên bạn nên đọc nó

RobertG đã viết trên.

Thay vì giảm kích thước cột từ

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
32 xuống
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
33, bạn đã thử đặt tùy chọn
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
34 của MySQL chưa? . nơi đây.

Chris đã viết trên.

Cảm ơn vì đã viết bài này. Nếu bất cứ ai đang thực hiện việc di chuyển này với Django, đừng quên thêm

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
0

…đến đối tượng

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
35 trong tệp cài đặt của bạn. Hy vọng điều này sẽ tiết kiệm thời gian cho người khác

Serge đã viết trên.

Chỉ một câu hỏi - tại sao bạn thích

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
49?

Mathias đã viết trên.

Xem câu trả lời Stack Overflow này để biết sự khác biệt giữa

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
38,
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
39 và
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
40

Tâm đã viết trên.

Xin chào các bạn, mình đã làm theo cách thiết lập ở trên, có vẻ như tất cả đều ổn, nhưng khi tôi chèn một

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
41 vào MySQL, nó báo lỗi 1062

Bảng và cột này được sử dụng

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
42

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
1

…Sau đó tôi tìm hiểu nếu thay đổi để sử dụng

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
43 thay vì
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
42 thì chèn hàng thứ hai mà không có bất kỳ lỗi nào, vậy có đề xuất nào để khắc phục điều này nếu tiếp tục sử dụng
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
42 không?

HS viết tiếp.

Bạn có thấy rằng có một đối chiếu

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
46 không? . Bất kỳ ý tưởng?

Cập nhật. https. // nhà phát triển. mysql. com/doc/refman/5. 6/en/charset-collation-names. html nói

Tên đối chiếu Unicode có thể bao gồm số phiên bản để cho biết phiên bản của Thuật toán đối chiếu Unicode (UCA) mà đối chiếu dựa trên đó. Các đối chiếu dựa trên UCA không có số phiên bản trong tên sử dụng các phím trọng số

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
48 UCA. Tên đối chiếu chẳng hạn như
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
49 dựa trên UCA 5. 2. 0 phím trọng lượng

Nghe có vẻ như

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
50 là viết tắt của tiêu chuẩn ngôn ngữ chứ không phải MySQL thích? . https. // lỗi. mysql. com/lỗi. php?id=9604

Có vẻ như MySQL sẽ không cập nhật nội dung Unicode được cho là để theo kịp các tiêu chuẩn vì có vẻ như điều đó có nghĩa là khách hàng của họ phải cập nhật nội dung của cơ sở dữ liệu hiện tại của họ. Sau đó, họ đã tạo đối chiếu mới, theo kịp tiêu chuẩn Unicode. Và phiên bản họ có sẵn là v5. 2. 0, đây là cái nào. http. //www. unicode. org/Công khai/UCA/5. 2. 0/phím. txt

Sau đó, có vẻ như sẽ tốt hơn nếu gắn bó với tiêu chuẩn Unicode thực sự, tôi. e.

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
46?

Có cách nào để biên dịch MySQL 5 không. 6 bằng cách sử dụng các phím trọng lượng UCA có sẵn mới nhất (v7. 0. 0 tại thời điểm viết)?

Allan Wallace đã viết trên.

Bài viết hay — mặc dù

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
37 có thể phù hợp hơn cho một số nhiệm vụ nhất định, vì việc phân biệt chữ hoa chữ thường có thể là một vấn đề trong một số ngữ cảnh nhất định hoặc khi việc sử dụng trọng âm trong ngôn ngữ làm thay đổi nghĩa của từ. e. g. nếu bạn đang cố gắng xây dựng một từ điển các thuật ngữ bằng tiếng Hy Lạp và bạn có một chỉ mục
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
54 được xác định để ngăn việc nhập các từ trùng lặp, thì bạn sẽ nhận được các từ trùng lặp sai đối với những từ không khớp

Ví dụ, đây là hai từ Hy Lạp có ý nghĩa khác nhau đáng kể, một trong số đó là thô lỗ, còn lại thì không.

μαλακά
μαλάκα

Nếu bạn cố chèn những thứ này vào cột

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
49, bạn sẽ nhận được “Lỗi MySQL 1062. mục nhập trùng lặp cho khóa”. Vì vậy, trong trường hợp cụ thể này,
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
37 là lựa chọn hợp lý

David Trotz đã viết về.

Cảm ơn bạn về bài viết — nó là cứu cánh giúp bạn hiểu rõ hơn về tài liệu MySQL

Tôi có một câu hỏi mà tôi vẫn chưa rõ. Nếu tôi có một cột

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/[dbName]?useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ci", "root", "root");
7 và nó không được lập chỉ mục, tôi có thể để kích thước của nó là
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
32 không?

David Trotz đã viết về.

Tôi đã trả lời và phát hiện ra một vài điều có thể giúp ích cho người đọc bài viết của bạn

Trước khi đi vào vấn đề đó, tôi muốn nhắc lại rằng bài viết của bạn cực kỳ hữu ích trong việc giúp tôi bắt đầu hiểu những gì tôi cần làm để nhận được sự hỗ trợ thích hợp của

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9. Cảm ơn bạn đã là người tiên phong ở đây

Lưu ý khi chuyển đổi chỉ mục

Bạn đã đề cập một chút lý do tại sao bạn thay đổi các cột từ

con = DriverManager.getConnection("jdbc:mysql://localhost:3306/[dbName]?useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ci", "root", "root");
7 thành
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/[dbName]?useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ci", "root", "root");
8 và bây giờ tôi đã hiểu tại sao bạn làm điều này, nhưng bạn đã không đề cập (mặc dù điều đó được ngụ ý nếu bạn hiểu MySQL) rằng điều này sẽ dẫn đến việc cắt bớt nếu bạn đang sử dụng nhiều hơn . MySQL sẽ cảnh báo bạn sau khi hành động bẩn được thực hiện, nhưng lúc đó thì đã quá muộn

Nó có thể hữu ích để giải thích rằng bạn chỉ cần làm điều này nếu bạn lập chỉ mục cột và không lo lắng về việc cắt bớt nhưng trên thực tế, bạn không cần phải làm điều đó, bởi vì bạn có thể chỉ cần tạo chỉ mục để chỉ sử dụng 191 ký tự hợp lệ

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
2

Để biết thêm về điều này, hãy xem. mysql 5. 5 tài liệu. 13. 1. 13 cú pháp

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
62

Lưu ý khi chuyển đổi bảng

Không cần thiết phải chuyển đổi tất cả các cột của bạn vì chúng sẽ kế thừa mã hóa của bảng và được chuyển đổi khi bảng được chuyển đổi, trên thực tế, ngay cả khi cột có mã hóa được chỉ định, cột sẽ nhận được mã hóa mặc định của bảng. Đây rất có thể là những gì bạn muốn nhưng tôi đưa nó ra ngoài như một lời cảnh báo cho những người khác

Cũng cần lưu ý khi chuyển đổi một bảng thành

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 từ
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9. nếu bạn có một cột là ________ 35 _______1, MySQL sẽ tự động nâng cấp cột đó thành
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
78 để chứa thêm không gian lưu trữ cần thiết cho mã hóa mới. Tôi chỉ thử nghiệm điều này với
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/[dbName]?useUnicode=true&characterEncoding=utf8mb4&connectionCollation=utf8mb4_unicode_ci", "root", "root");
1 và cho rằng nó tương tự với
java.sql.SQLException: Illegal mix of collations (utf8mb4_unicode_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '='
7, v.v.

Tôi nói tất cả những điều đó để lưu ý rằng bạn thực sự không cần phải chạy

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
3

…trên tất cả các cột của bạn trừ khi bạn muốn ghi đè hành vi mặc định kế thừa từ bảng khi nó được chuyển đổi. Nó sẽ chạy lại và lãng phí thời gian của bạn, vì nó không nhìn vào lệnh

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
69 của bạn và lưu ý rằng sẽ không có thay đổi nào xảy ra

Peter Torelli đã viết trên.

bài đăng tuyệt vời. Tôi đã thực hiện tất cả các cập nhật cho máy chủ của mình mà bạn chỉ định. Tuy nhiên, khi tôi nhập dòng kiểm tra của bạn

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
8 thì vẫn còn một khoảng trống trong kết quả đã chọn, như vậy

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
4

Tôi đã bỏ lỡ cái gì?

Beau Key đã viết trên.

Có thể tôi ngu ngốc nhưng việc tạo bản sao lưu của tất cả cơ sở dữ liệu (có liên quan), xóa cơ sở dữ liệu, cập nhật

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
71 và khôi phục cơ sở dữ liệu từ bản sao lưu không dễ dàng hơn sao?

Mehdi đã viết trên.

bài viết thực sự hữu ích

Cảm ơn rất nhiều

Klaus đã viết trên.

Tôi đang sử dụng

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
49 trong MySQL nhưng khi tôi tải lên một tệp có UTF-8 (CP 65001) thì tôi nhận được tất cả tiếng Đức “Umlaute”
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
73 sai những gì tôi có thể thấy đúng trong trình chỉnh sửa Notepad

hnuecke đã viết trên.

Cảm ơn bạn vì những gợi ý và giải thích tuyệt vời;

Tôi đã có cùng một cấu hình lộn xộn như. Tôi đã đạt được một số tiến bộ, nhưng tôi vẫn không thể đặt

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
74 và
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
75 thành
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0. biến của tôi thực sự trông như thế này

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
5

Tôi cho rằng điều này ngăn tôi chuyển đổi trang WordPress của mình thành nhiều trang. Ít nhất tôi vẫn nhận được thông báo lỗi khi WordPress cố gắng tạo bảng cho một trang web mới

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
6

WordPress sử dụng

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 kể từ tháng 3 hoặc tháng 4 năm 2015, tôi nghĩ vậy. Tôi cũng đang kiểm tra trong diễn đàn WP xem những gì tôi thấy có phải là lỗi không, bởi vì các bảng cho trang web đầu tiên có thể được tạo. Hy vọng ai đó ở đây có thể cho tôi một gợi ý về cách tôi có thể quản lý để thay đổi bộ ký tự cho hai biến còn lại

Thanks

Chris Christoff đã viết trên.

Thấy

Paul đã viết trên.

Cảm ơn bạn về hướng dẫn này — nó thực sự hữu ích

Tôi cũng phải loại bỏ và tạo lại tất cả các thủ tục được lưu trữ của cơ sở dữ liệu (và cả các chức năng) để chúng thực thi trong bộ ký tự mới, nếu không tôi sẽ nhận được.

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
78 khi gọi cho họ. Ngay cả khi
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
43 bằng với
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0

Chạy

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
7

…để xem quy trình nào chưa được cập nhật lên các giá trị đối chiếu cơ sở dữ liệu mới của máy chủ

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
41,
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
48 và

Justin Lee đã viết trên.

Cảm ơn bạn rất nhiều vì bài viết này, Mathias. Tôi không biết làm thế nào tôi có thể khắc phục sự cố UTF-8 của mình nếu không có điều này

Tôi đã làm theo một số lời khuyên trong một số nhận xét khác và tôi đã dành một ngày để viết lại toàn bộ dự án của mình để sử dụng Postgres thay thế. Nó không quá tệ. Nó chủ yếu liên quan đến việc thay đổi tất cả MySQL SQL vui nhộn không chuẩn thành SQL thích hợp. Và đoán xem, trong Postgres, nội dung UTF-8 hoạt động vượt trội. Bạn không phải chỉ định bất cứ điều gì. Nó chỉ hoạt động theo mặc định vì đó là cách đúng đắn để thực hiện

Đối với bất kỳ ai khác tình cờ thấy trang web này tại đây, tôi khuyến khích bạn chuyển sang PostgreSQL. MySQL đã được mua bởi Oracle và họ đã không làm bất cứ điều gì kể từ đó. Tôi nghĩ rằng nó đã bị hỏng ngay cả trước đây

Có vẻ như Michael Stonebreaker vẫn sẽ cười cuối cùng với Larry Ellison;) (ít nhất là về chất lượng phần mềm)

Erez đã viết trên.

Sử dụng SqlWorkbench, tôi không thể thay đổi

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
83 và
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
41 cho đến khi tôi sử dụng dòng sau đây như một phần của tập lệnh do bạn cung cấp.
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
85

Cài đặt này bị xóa mỗi khi tôi khởi động lại SqlWorkbench. Bất kỳ ý tưởng làm thế nào để giữ nó?

Dennis A đã viết trên.

Tôi đã thực hiện tất cả các bước này và hiện tại mọi thứ đều ổn trong các bảng của tôi, nhưng máy chủ vẫn bị treo khi tôi cố gắng gửi một biểu mẫu có chứa các biểu tượng cảm xúc gây phiền nhiễu hiện đang xuất hiện trong giao tiếp của mọi người. Tôi đang sử dụng trình kết nối MySQL ODBC vì phần mềm này rất cũ. Tôi tự hỏi liệu trình kết nối có phải là lý do khiến nó bị lỗi không. Phiên bản MySQL của tôi là 5. 5. 36

Mighty Chaffinch đã viết về.

Bất kỳ ai sử dụng Trình kết nối/ODBC nên biết lời khuyên trong lỗi MySQL #69021

Xin lưu ý rằng trong mọi trường hợp, ứng dụng của bạn không được đặt bộ ký tự cho kết nối hoặc kết quả, v.v. Nó luôn được trình điều khiển đặt tại thời điểm kết nối thành UTF-8. UTF-8 được sử dụng làm bộ ký tự “vận chuyển” để giao tiếp với máy chủ. Vì vậy, việc chuyển đổi dữ liệu thường diễn ra tương tự như sau

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
8

Như bạn có thể thấy ở cả hai đầu [ASP] và [Bảng MySQL], dữ liệu ở dạng UFT8MB4

Một lần nữa, ứng dụng phải chỉ ra bộ ký tự dự định sử dụng tùy chọn đặc biệt

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
86 và không nên cố gắng đặt bất kỳ thuộc tính kết nối nào vì nó gây nhầm lẫn cho các chức năng chuyển đổi trình điều khiển

Ngoài ra, nếu bạn muốn quay lại văn bản từ các biểu mẫu ASP cổ điển trở lại MySQL, bạn cần đặt

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
9

Và lưu các tệp

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
87 của bạn dưới dạng UTF-8 trong trình soạn thảo văn bản của bạn

Hy vọng điều này sẽ cứu ai đó nỗi đau và sự nhầm lẫn mà tôi đã trải qua khi tìm đến giải pháp này

Moz đã viết trên.

Và đừng quên phân tán

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
88 một cách tự do xung quanh bất kỳ tập lệnh xử lý cơ sở dữ liệu nào mà bạn có thể có, vì nhiều tiện ích MySQL mặc định là
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 và chọn môi trường cục bộ nếu bạn không bắt buộc ___1_______0 thích hợp trên mọi thứ

Ngoài ra, cảm ơn bạn rất nhiều vì đã thu thập mọi thứ vào một trang như thế này. Nó làm cho một quá trình khủng khiếp dễ dàng hơn một chút

Petovan đạo đức giả đã viết trên.

Cảm ơn hướng dẫn toàn diện này để thêm đống phân trên các trang web ở mọi nơi

hoekma đã viết trên.

Tôi đặt cài đặt cho ba phần vào

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
05 và khởi động lại máy chủ nhưng không phải tất cả chúng đều được áp dụng khi tôi kiểm tra lệnh
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
92. Đó là vấn đề chính xác giống như. Tuy nhiên, khi tôi đặt các cài đặt vào
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
93, tất cả chúng đều được áp dụng thành công

Hy vọng rằng điều này sẽ giúp một ai đó

P. S. Máy chủ MySQL phiên bản 5. 5. 46 và Ubuntu 14. 04. 2

Brad Kent đã viết trên.

Bàn làm việc của MySQL yêu cầu bạn phải

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
94 sau khi kết nối — không có cách nào để định cấu hình nó để sử dụng cài đặt mặc định hoặc cài đặt cho mỗi kết nối đã xác định

Oliver đã viết trên.

Tôi nghĩ bạn gặp lỗi trong “Bước 3. Sửa đổi cơ sở dữ liệu, bảng và cột” trong câu lệnh

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
69

ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Nó nói hai lần

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
96 nhưng thực ra nó phải như thế này

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)
1

…và bạn nên sử dụng

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
97 thay vì
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
98 vì nó kém hiệu quả hơn

Chúc mừng Oliver

Mikael đã viết trên.

Tôi đã tự hỏi tại sao bạn đề xuất utf8mb4 thay vì utf32?

Mikael đã viết trên.

Tôi vừa thay đổi mặc định máy chủ của mình thành utf32 và cũng làm như vậy với cơ sở dữ liệu và bảng. Tôi cũng đã thay đổi mặc định của máy khách thành utf32 và đó hóa ra là một ý tưởng tồi. Lệnh 'mysql', trên Linux, bị nghẹt và xuất hiện lỗi này (không có thêm thông tin)

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)
2

Vì vậy, tôi đã phải thay đổi mã hóa mặc định của máy khách thành "utf8mb4". đầu ra của

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
8

Bây giờ có ý nghĩa vì chỉ phía máy khách sử dụng utf8mb4 và máy chủ sử dụng utf32

Sam đã viết trên.

Bạn có biết nơi để thêm nó nếu tôi đang sử dụng Flask không?

Bạn đã thêm cài đặt vào các thủ tục được lưu trữ khi bạn tạo lại chúng chưa?

Bắp cải nổ đã viết trên.

tôi nghĩ bạn có một lỗi đánh máy.

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
28 và
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
03 cần phải được viết là
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
04 và
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
05 (gạch dưới thay vì gạch nối) trong
mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
38, ít nhất là trên máy của tôi

newPaul đã viết trên.

Tôi đang sử dụng XAMPP. Tôi tìm tệp

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
38 ở đâu?

Shah Hussain đã viết trên.

Trong XAMPP, bạn phải thực hiện tất cả điều này trong "my. ini" trong tab cấu hình mysql

Shashi đã viết trên.

@ArunMohan Tôi cũng gặp vấn đề tương tự… Trong trường hợp của tôi, phiên bản trình kết nối mysql là vấn đề. Tôi đã sử dụng 5. 1. 22; . 0. 3 và nó đã hoạt động. Hi vọng điêu nay co ich

Rick James đã viết trên.

3 cái

[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
08 nhiều quá, chắc hỏng. Đặc biệt,
[client]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
09 có thể sẽ thất bại nếu
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
33 không được thực hiện trước

Vấn đề

# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# (Don’t blindly copy-paste this! The exact statement depends on the column type, maximum length, and other properties. The above line is just an example for a `VARCHAR` column.)
33 đã được loại bỏ trong 5. 7

Raoul Duk đã viết trên.

Bài báo tuyệt vời

Tôi có một câu hỏi tiếp theo. là chuyển đổi một kịch bản tất cả hoặc không có gì?

Giả sử tôi có một cơ sở dữ liệu với > 70 bảng và tôi biết rằng tôi thực sự chỉ quan tâm đến

mysql> SHOW WARNINGS;
+---------+------+------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+------------------------------------------------------------------------------+
| Warning | 1366 | Incorrect string value: '\xF0\x9D\x8C\x86' for column 'column_name' at row 1 |
+---------+------+------------------------------------------------------------------------------+
1 row in set (0.00 sec)
49 trong một bảng cụ thể. Tôi biết tôi chỉ có thể chuyển đổi một bảng cụ thể đó. Nhưng câu hỏi của tôi là. trong kết nối máy khách của tôi (từ ứng dụng Python Django), tôi cần đặt mã hóa thành
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 để đảm bảo rằng tôi đang chèn/truy vấn dữ liệu theo đúng mã hóa cho bảng được đề cập

Nhưng có hại không khi cài đặt đó làm cài đặt toàn cầu trong tất cả các kết nối DB cho tất cả các bảng mà tôi chưa di chuyển sang

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0?

Hay tốt hơn là di chuyển tất cả các bảng?

Prateek Gupte đã viết trên.

Điều này sẽ chăm sóc các bản sao cho cơ sở dữ liệu?

dGo đã viết trên.

Cám ơn vì cái này. Tôi đã viết một đoạn script nhỏ để tạo truy vấn cập nhật cho bảng, cột và dạng xem. Nếu nó đúng (tôi đang hỏi), tôi nghĩ nó cũng có thể hữu ích cho những người khác. Vì vậy, tập lệnh này tạo và danh sách các truy vấn SQL mà bạn sẽ phải chạy để cập nhật bộ ký tự bảng, cột và dạng xem