2008-10-13 22 views
7

Cơ sở dữ liệu MySQL được ứng dụng Rails của tôi sử dụng hiện có collation mặc định là latin1_swedish_ci. Vì bộ ký tự mặc định của các ứng dụng Rails (bao gồm cả của tôi) là UTF-8, có vẻ hợp lý với tôi khi sử dụng collation utf8_general_ci trong cơ sở dữ liệu.Tôi có nên di chuyển cơ sở dữ liệu MySQL bằng cách đối chiếu latin1_swedish_ci thành utf-8 và, nếu có, làm cách nào?

Suy nghĩ của tôi có đúng không?

Giả sử đó là, cách tiếp cận tốt nhất để di chuyển collation và tất cả dữ liệu trong cơ sở dữ liệu sang mã hóa mới là gì?

Trả lời

1

Chuyển đổi thành UTF-8 làm bảng ký tự.

Cài đặt đối chiếu chỉ được sử dụng để sắp xếp và các công cụ tương tự. Chọn đối chiếu mà hầu hết người dùng của bạn mong đợi.

4

UTF-8, cũng như bất kỳ lược đồ mã hóa Unicode nào khác, có thể lưu trữ các ký tự bằng bất kỳ ngôn ngữ nào, vì vậy nó là một lựa chọn tuyệt vời của mã cho cơ sở dữ liệu của bạn.

Mặt khác, cài đặt đối chiếu là vấn đề hoàn toàn riêng biệt với lược đồ mã hóa. Nó bao gồm các đơn đặt hàng sắp xếp, chuyển đổi trên/chữ thường, so sánh chuỗi bình đẳng và những thứ như ngôn ngữ cụ thể. Cài đặt đối chiếu phải khớp với ngôn ngữ được sử dụng trong cơ sở dữ liệu.

Tổng hợp UTF-8 là (tôi giả định ở đây — tôi không quen thuộc với MySQL nói riêng) được sử dụng cho các tình huống không biết ngôn ngữ và cần phải đặt một số thứ tự mặc định đơn giản. Nó có thể tương ứng với thứ tự điểm mã Unicode, mà gần như chắc chắn không phải là những gì bạn muốn nếu bạn đang lưu trữ Thụy Điển.

1

Cung cấp dữ liệu hiện có của bạn trong cơ sở dữ liệu được mã hóa đúng theo latin1, chuyển đổi bảng thành utf8 (sử dụng ALTER TABLE, như được mô tả trong tài liệu) sẽ hoạt động.

Sau đó, tất cả các ứng dụng của bạn cần làm là tiếp tục làm bất cứ điều gì nó đã làm trước đây. Nếu ứng dụng của bạn muốn sử dụng các ký tự unicode, nó sẽ đặt mã hóa kết nối thành utf8 và sử dụng utf8, nhưng đó là vấn đề của riêng nó.


Vấn đề ở đây là một số lượng lớn ứng dụng web crap đã gửi dữ liệu utf8 tới mysql và yêu cầu xử lý dữ liệu đó là latin1. MySQL sẽ tôn vinh điều này một cách hoàn hảo và tiết kiệm rác vào các bảng, theo hướng dẫn.

Việc chuyển đổi bảng từ latin1 sang utf8 sẽ KHÔNG sửa lỗi này, vì bạn thực sự có tổng số rác trong đó. Sửa chữa chúng là không cần thiết, đặc biệt nếu trong suốt vòng đời của ứng dụng, nó đang nói các loại rác khác nhau cho cơ sở dữ liệu.

+0

Vâng, dữ liệu được xuất phát từ một ứng dụng Rails trong đó có mã hóa ký tự thiết lập để utf-8, không phải latin1. Có lẽ điều này đặt ứng dụng của tôi vào danh mục 'ứng dụng web crap' đang gửi utf-8 đến bảng latin1? Bạn đề nghị tôi làm gì để chuyển đổi dữ liệu? – Olly

+0

Câu trả lời này gây nhầm lẫn đối chiếu với mã hóa ký tự – mattmanser

0

Sử dụng dưới đây truy vấn mysql để chuyển đổi cột của bạn:

ALTER TABLE users MODIFY description VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

Để xem đầy đủ chi tiết về bảng của bạn:

SHOW FULL COLUMNS FROM users; 
Các vấn đề liên quan