Hướng dẫn mysql charset latin1 vs utf8 - mysql charset latin1 vs utf8

Ai trong chúng ta đúng?

Ngày xửa ngày xưa, ông chủ của bạn là. Nhưng khi thời gian trôi qua, mọi thứ thay đổi. Ngày nay, bạn là (nhưng trước khi chạy đến sếp của bạn, hãy chắc chắn đọc câu trả lời của Nelson).be sure to read Nelson's answer too).

Các phiên bản cũ của MySQL và các phiên bản cũ của hầu hết mọi thứ, được xử lý tốt hơn nhiều với Latin1/ISO-8859-1 (5) cũ hơn nhiều so với UTF8.

Có một lý do tại sao UTF8 đã được tạo ra, phát triển và đẩy hầu hết mọi nơi: nếu được thực hiện đúng cách, nó hoạt động tốt hơn nhiều. Có một số vấn đề về hiệu suất và lưu trữ xuất phát từ thực tế là một ký tự Latin1 là 8 bit, trong khi một ký tự UTF8 có thể dài từ 8 đến 32 bit. Vì vậy, khi lập kế hoạch VARCHAR, bạn cần tính đến điều này. Và thói quen tìm kiếm của bạn sẽ chậm hơn một chút. Họ sẽ có thể làm nhiều việc hơn (ví dụ: các tìm kiếm có độ nhạy của điểm nhấn hoặc không có. Không thể thực hiện những thứ đó trong Latin1 mà không có công việc rộng rãi), nhưng họ sẽ mất thêm một chút thời gian.

Nhưng mặt khác, lưu trữ là rẻ, chi phí thực tế về kích thước tệp dưới 2-3%, sức mạnh tính toán cũng rẻ và rẻ hơn theo luật của Moore; Trong khi thời gian và kỳ vọng của khách hàng của bạn chắc chắn không.your time and your customers' expectations definitely aren't.

Bạn có thể phải lo lắng cho các công cụ tìm kiếm, v.v. Nếu bạn là người phát triển các công cụ như vậy. Nhưng có lẽ bạn không. Bạn sử dụng những công cụ đó; Ngay cả những người không hoàn toàn tuân thủ UTF8 ngày hôm qua (như MySQLS trước đó không), ngày nay hoặc sẽ sớm (ví dụ: MySQL với hỗ trợ UTF8MB4).

Vì vậy, bằng cách lập kế hoạch cẩn thận và thực hiện UTF8 đúng cách (không tát nó qua Latin1 như một suy nghĩ sau), bạn có thể có mã rất hợp lý trong tương lai Điều. Và nếu bạn không có kế hoạch như vậy, những người khác sẽ có, và những người đó có thể là khách hàng, nhà cung cấp hoặc đối tác của bạn.not slapping it over Latin1 as an afterthought) you can have code that is very reasonably future-proof, which, if you plan on ever doing business with any Asiatic country, is a Very Good Thing. And if you have no such plans, other people will have, and those people could be your customers, suppliers, or partners.

Vì vậy, khi họ bắt đầu gửi dữ liệu UTF8 của bạn, bạn sẽ phải thiết lập một điều phức tạp để chuyển đổi sang và fro latin1, và xử lý các trường hợp không thể giải quyết được.

Khi bạn tính đến ngân sách, chi phí của một số cuộc giao tranh chống lại các ninja mojibake độc ​​ác và xem xét rằng chúng sẽ không biến mất - như bạn đã phát hiện ra - thì bạn sẽ nhận ra rằng việc đi UTF8 không chỉ đơn giản hơn, nó sẽ rẻ hơn là tốt.

Tôi có một bảng trong utf8 với các bản ghi> 80m và một trong các cột (char(6) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL) có thể chỉ chứa các ký hiệu Latin ([a-zA-Z0-9]). Nó có ý nghĩa để chuyển đổi cột này thành Latin1 không?

MySQL Doc nói:

Để tiết kiệm không gian với UTF-8, hãy sử dụng varchar thay vì char. Mặt khác, MySQL phải đặt trước ba byte cho mỗi ký tự trong cột Set ký tự UTF8 vì đó là chiều dài ký tự tối đa có thể. Ví dụ: MySQL phải đặt trước 30 byte cho cột UTF8 ký tự char (10).

Tôi đã thực hiện một bài kiểm tra - đã tạo 2 bảng có cùng một bản ghi 50m:

CREATE TABLE `t_utf8` (
  `c_1` char(6) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
  UNIQUE KEY `index_t_utf8_on_c_1` (`c_1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

CREATE TABLE `t_lat` (
  `c_1` char(6) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
  UNIQUE KEY `index_t_lat_on_c_1` (`c_1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;

Nhưng MySQL nói rằng chúng có kích thước gần như cùng nhau:

           Name: t_lat
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 57557700
 Avg_row_length: 30
    Data_length: 1741668352
Max_data_length: 0
   Index_length: 0
      Data_free: 2097152
 Auto_increment: NULL
      Collation: utf8_general_ci
 Create_options: row_format=COMPACT

           Name: t_utf8
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 57554528
 Avg_row_length: 31
    Data_length: 1810874368
Max_data_length: 0
   Index_length: 0
      Data_free: 3145728
 Auto_increment: NULL
      Collation: utf8_general_ci
 Create_options: row_format=COMPACT

Tại sao nó như vậy?

  • MySQL 5.7
  • Innodb

P.S: Tôi đã thực hiện thử nghiệm tương tự với Myisam và có lợi ích dự kiến: Bảng với Latin1 - 383MB, UTF8 - 1GB. Nhưng tại sao nó không hoạt động cho Innodb?

Mihai Peteu

Mihai Peteu

Mặt trước SR

Xuất bản ngày 27 tháng 9 năm 2016

Trong vài tuần qua, tôi không thể tìm ra lý do tại sao một số nhân vật đặc biệt rón rén trong các mô tả sự kiện cho người tổng hợp chương trình trực tiếp của tôi. Ví dụ, một ký tự đơn giản như một trích dẫn duy nhất (') đã được hiển thị dưới dạng à ¢ Â.

Theo như tôi có thể nói, đó không phải là do thay đổi mã. Lược đồ cơ sở dữ liệu luôn luôn giống nhau. Lý do tốt nhất tôi có thể tìm thấy là các nguồn mà tôi đã lấy thông tin từ bằng cách nào đó đã thay đổi mã hóa nhân vật của họ. Không chỉ nó gây khó chịu cho mắt, mà còn bắt đầu gây ra lỗi phân tích cú pháp JSON, giết chết giao diện người dùng.

Tóm lại, có lẽ lỗi của tôi khi không có bất cẩn khi mã hóa Latin1 cho toàn bộ cơ sở dữ liệu của tôi. Nếu bạn ở cùng một chiếc thuyền, hãy xem danh sách kiểm tra sau:

. Set your database and child tables to use the utf8 character set, repeating the 2nd query for each table:

  • Thay đổi ký tự cơ sở dữ liệu SET UTF8 đối chiếu UTF8_UNICODE_CI;
  • Thay đổi bảng chuyển đổi sang bộ ký tự UTF8 đối chiếu UTF8_UNICODE_CI;

(2) Chỉ định liên kết cơ sở dữ liệu của bạn để sử dụng UTF8 khi bạn tạo nó lần đầu tiên Specify your database link to also use utf8 when you first create it

. On the display end, make sure to set the charset in your HTML meta tag:

Tất cả các vấn đề về hiệu suất sang một bên, tôi không thấy bất kỳ lý do chính đáng nào để chọn Latin1 hơn UTF8. Rốt cuộc, hầu hết các cơ sở dữ liệu ngoài kia đều được mã hóa UTF8, cung cấp hỗ trợ nhân vật quốc tế.

Hy vọng rằng điều này sẽ giúp một người khác mất những viên bi của họ về các vấn đề tương tự.

Khám phá các chủ đề

Không UTF

Các ký tự và ký hiệu này là một phần của hệ thống mã hóa lớn hơn nhiều gọi là UTF8, bao gồm Latin1. Kể từ khi bắt đầu của WRD, tất cả dữ liệu của chúng tôi đã được lưu trữ trong mã hóa Latin1. Khi WRD trở nên toàn cầu hơn về phạm vi và nặng hơn nhiều, nhu cầu chuyển sang mã hóa UTF-8 là rõ ràng.UTF8, which also includes Latin1. Since WRDS' inception, all of our data has been stored in Latin1 encoding. As WRDS becomes much more global in scope and much more text-heavy, the need to move to UTF-8 encoding is apparent.

Tôi có nên sử dụng UTF không

Nếu bạn cần cơ sở dữ liệu, đừng sử dụng MySQL hoặc Mariadb.Sử dụng Postgresql.Nếu bạn cần sử dụng MySQL hoặc MariaDB, không bao giờ sử dụng UTF8.Luôn luôn sử dụng UTF8MB4 khi bạn muốn UTF-8.Always use “utf8mb4” when you want UTF-8.

Mysql latin1 là gì?

Bộ ký tự Latin1 MySQL là một nhân vật một byte cho Tây Âu và đó là bộ ký tự mặc định của MySQL lên đến và bao gồm 5,7.Mặc dù có tên, bộ ký tự thực sự tuân thủ Windows-1252, đây là một siêu âm của ISO-8859-1, còn được gọi là Latin-1.a one-byte character set for Western Europe, and it is the default character set of MySQL up to and including 5.7. In spite of the name, the character set is actually Windows-1252 compliant, which is a superset of ISO-8859-1, also known as Latin-1.

Mã hóa là gì = 'latin1?

ISO 8859-1 là định dạng ký tự và mã hóa ký tự Latin-1 tiêu chuẩn ISO.CP1252 là những gì Microsoft định nghĩa là Superset của ISO 8859-1.Do đó, có khoảng 27 ký tự bổ sung không được bao gồm trong tiêu chuẩn ISO 8859-1.. CP1252 is what Microsoft defined as the superset of ISO 8859-1. Thus, there are approximately 27 extra characters that are not included in the standard ISO 8859-1.