Bộ ký tự mysql nhị phâ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?

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

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

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 biểu tượng 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, thay vào đó, việc cố gắng chèn
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
8 thực sự đã 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 sự cố 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

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

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 phù 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% (
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
85) 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

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

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 văn

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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
6

$ 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 sẽ 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 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

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
17 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
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
17 sử dụng
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 nhưng phải có thể chứa 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ư
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
51 — bởi vì nếu bạn cố gắng điền cột đó bằng các ký tự bốn byte, thì 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ữ

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
52 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 tương ứng 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 với 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
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
57 được lập chỉ mục thành
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
58. )

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, đặ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
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
200 bằng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
201. Nếu câu lệnh
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
202 cũ của bạn chỉ định đối chiếu, hãy đảm bảo thay đổi cả điều đó, e. g.
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
203 trở thành
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
204

Đả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 (

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

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

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

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

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à
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
208 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à
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
209 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ĩ nó 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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
211 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

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

$ 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 →
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
217

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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
218 là gì?

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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
219, vốn đã là mặc định vì
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
220?

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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
218 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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
219, vốn đã là mặc định vì
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
220?

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
202 cho biết bộ ký tự nào 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 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õ. Cảm ơn

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

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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
218 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
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
232, với
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
233, với
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
234 thay vì
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
235). 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?

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
228 không phải là giá trị duy nhất bạn có thể đặt (không có
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
237) trong
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
238 (vâng,
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
239 cũng vậy, nhưng hiện tại điều đó 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
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
240 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 máy khách (
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
241,
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
242 và
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
243) sẽ luôn là giá trị này. Bạn không cần sử dụng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
237 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
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
228

Mathias đã viết trên.

Đặt

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
218 (hoặc sử dụng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
247) là cách duy nhất để tôi có thể khiến
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
248 hiển thị dưới dạng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
249 thay vì
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
250 khi thực hiện truy vấn
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
251. 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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
237 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ụ
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
205 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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
254 thay vì
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
255, tôi có thể thực hiện việc này thành công bằng cách sử dụng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
256. Nhưng bạn chỉ cần sử dụng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
254 cho
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
258, nếu không, bạn có thể sử dụng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
255 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 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.

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
228 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
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
263. 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
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
264. 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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
202 hoặc
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
266 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 vào 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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
268 sau những thay đổi này, đó 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 mã hóa 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

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

…và với

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
271, 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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
218 và sửa nó với
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
274

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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
275. Sau khi tôi thay đổi loại thành
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
276, 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.

Sự cố

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
278 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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
278 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
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
51 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

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

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ề mứ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
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 3 byte. 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 chưa hoàn chỉnh. 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.

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
287 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

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

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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
288 thành
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
289

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

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

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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
290 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 trên.

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ố

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

Đâ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. Thử sử dụng trình điều khiển JDBC có hỗ trợ
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0 — MySQL Connector/J 5. 1. 13 (hoặc phiên bản mới hơn) chẳng hạn

Julia Neystadt đã viết trên.

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

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

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

Julia

Julia Neystadt đã viết trên.

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ó

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
294 ​​trong
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
238 và
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
296 trong kết nối JDBC của mình. Tùy thuộc vào phiên bản MySQL Connector/J của bạn, bạn cũng cần phải có
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
297 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 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ý
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
299 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
601

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

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

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

Mathias đã viết trên.

Cảm ơn. 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ó thể có

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0. Đã 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

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

Đây là giao diện của

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
605 của tôi

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

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

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

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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
608,
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
609 và
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
610

Mathias đã viết trên.

Bạn có chắc tệp

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
238 mà bạn đang chỉnh sửa là tệp được tải không?

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

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

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

Đả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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
238 sang
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
613 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

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

Câu lệnh sql

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

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

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

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

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

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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
61

Đ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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
62

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

Binyamin đã viết trên.

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
615 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
615 trong
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
618 và
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
619?

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

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

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

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

Không có phần

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
618 và
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
619 thì kết quả đã khác

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

Mihai đã viết trên.

bài viết rất tốt. Chúng tôi đã biết về hỗn hợp có tên là

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
9 này, 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.

Cảm ơn. 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 để đặt

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
248 trong 5. 6. 15. Cảm ơn rất nhiều

HS viết tiếp.

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

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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
238 dưới
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
626. 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
67

Khi chạy

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

tôi hiểu rồi

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

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
    $ mysqlcheck -u root -p --auto-repair --optimize --all-databases
    238 không?

Cảm ơn

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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
238, 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
632 xuống
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
633, bạn đã thử đặt tùy chọn
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
634 của MySQL chưa? . đâ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

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

…đến đối tượng

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
635 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

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

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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
638,
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
639 và
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
640

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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
641 vào MySQL, nó báo lỗi 1062

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

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

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

…sau đó mình tìm hiểu nếu đổi sang dùng

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
643 thay vì dùng
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
642 thì chèn hàng thứ 2 vào không bị lỗi, vậy có gợi ý nào khắc phục nếu tiếp tục dùng
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
642 không?

HS viết tiếp.

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

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
646 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ố UCA

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
648. Tên đối chiếu chẳng hạn như
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
649 dựa trên UCA 5. 2. 0 phím trọng lượng

Nghe có vẻ như

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
650 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
646?

Có cách nào để biên dịch MySQL 5. 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
637 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
654 đượ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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
249, 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
637 là tùy 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

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
57 và nó không được lập chỉ mục, tôi có thể để kích thước của cột đó là
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
632 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 tôi đi sâu 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ừ

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
57 thành
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
58 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ệ

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

Để 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
662

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à
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
51, MySQL sẽ tự động nâng cấp cột đó lên
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
278 để chứa thêm dung lượng 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
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
51 và cho rằng nó tương tự với
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
17, 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

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

…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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
669 của bạn và lưu ý rằng sẽ không có thay đổi nào diễn 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 thử nghiệm của bạn

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

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

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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
671 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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
249 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
673 sai những gì tôi có thể thấy ngay 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
674 và
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
675 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

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

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

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

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

Cảm ơn

Chris Christoff đã viết trên.

Nhì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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
678 khi gọi cho họ. Ngay cả khi
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
243 bằng
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
0

Chạy

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

…để 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ủ

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
241,
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
248 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
683 và
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
241 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
685

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 về lời khuyên trong MySQL bug #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

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

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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
686 và không nên cố đặ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

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

Và lưu các tệp

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
687 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 tự do

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
688 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ì rất nhiều tiện ích MySQL mặc định là ____09 và chọn môi trường cục bộ nếu bạn không buộc ____10 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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
205 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
692. Đó là vấn đề chính xác giống như. Tuy nhiên, khi tôi đặt cài đặt vào
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
693, 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
694 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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
669

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

Nó nói hai lần

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
696 nhưng thực ra nó phải như thế này

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

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

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
697 thay vì
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
698 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)

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

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 table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
68

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 quy trình được lưu trữ khi bạn tạo lại chúng chưa?

ExplodingCabbage đã viết trên.

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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
228 và
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
003 cần phải được viết là
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
004 và
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
005 (gạch dưới thay vì gạch nối) trong
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
238, í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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
238 ở đâ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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
008 nhiều quá, chắc hỏng. Đặc biệt,
$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
009 có thể sẽ thất bại nếu
# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
633 không được thực hiện trước

Vấn đề

# For each table
REPAIR TABLE table_name;
OPTIMIZE TABLE table_name;
633 đã đượ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

$ mysqlcheck -u root -p --auto-repair --optimize --all-databases
249 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 ứng dụng 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