Hướng dẫn mysql default character set utf8mb4 - bộ ký tự mặc định mysql utf8mb4

Từ MySQL 8.0, UTF8MB4 là bộ ký tự mặc định và mặc định & NBSP; đối chiếu cho UTF8MB4 là UTF8MB4_0900_AI_CI. MySQL 8.0 cũng đang đến & nbsp; với một bộ cộng đồng Unicode hoàn toàn mới cho ký tự UTF8MB4 & NBSP; được đặt.utf8mb4 is the default character set, and the default collation for utf8mb4 is utf8mb4_0900_ai_ci. MySQL 8.0 is also coming with a whole new set of Unicode collations for the utf8mb4 character set.

Điều này sẽ cho phép sử dụng ký tự Unicode 9.0.0 hoàn chỉnh được đặt trong & nbsp; MySQL và đối với các ứng dụng mới, đây là một tin tuyệt vời. Nhưng những gì về các ứng dụng cũ & nbsp; Làm thế nào sẽ gây đau đớn khi hiện đại hóa bộ ký tự & nbsp; sử dụng cho một ứng dụng hiện có dựa trên 5,7?

Giới thiệu

Trước tiên, chúng ta cần hiểu cách MySQL hoạt động liên quan đến ký tự & nbsp; bộ và đối chiếu:

Mỗi lược đồ (còn được gọi là cơ sở dữ liệu của người Viking trong MySQL), có một bộ ký tự mặc định & nbsp; ký tự và đối chiếu mặc định. Vì vậy, tất cả các bảng được tạo trong đó & nbsp; theo mặc định sẽ kế thừa bộ ký tự và đối chiếu từ & nbsp; lược đồ.

Để thay đổi điều này, chạy:

Thay đổi Schemasdefaultcharset UTF8MB4;SCHEMAsDEFAULTCHARSET utf8mb4;

Mỗi bảng cũng có một bộ ký tự mặc định và một đối chiếu mặc định & nbsp; theo mặc định được kế thừa bởi các cột trong bảng. & nbsp; để thay đổi bộ ký tự mặc định của bảng & nbsp; chạy:

Thay đổi TabletDefaultcharset UTF8MB4;TABLEtDEFAULTCHARSET utf8mb4;

Việc thay đổi bộ/đối chiếu ký tự mặc định của lược đồ/bảng sẽ không thay đổi bất kỳ cột hoặc dữ liệu hiện có nào. Hai sự thật này ngụ ý rằng nếu bạn nâng cấp từ 5,7 lên 8,0 và sau & nbsp; việc nâng cấp tạo ra không có lược đồ mới, MySQL sẽ hoạt động như trước với & nbsp; liên quan đến các bộ và đối chiếu ký tự.

Ngoài ra, bạn cần biết rằng đối với mỗi ký tự được đặt trong mysql & nbsp; có một đối chiếu mặc định và mỗi & nbsp; đối chiếu ngụ ý một ký tự & nbsp; set.

Điều này có nghĩa là trong:

col1 varchar (100) bộ ký tự UTF8MB4,VARCHAR(100)CHARACTER SET utf8mb4,

col2 varchar (100) đối chiếu ASUTF8MB4_SV_0900_AI_CIVARCHAR(100)COLLATE ASutf8mb4_sv_0900_ai_ci

Col1 Nhận đối chiếu UTF8MB4_0900_AI_CI và COL2 Nhận ký tự & NBSP; Đặt UTF8MB4.

Vì vậy, để tận dụng các đối chiếu mới cho các ứng dụng hiện tại & NBSP; đã nâng cấp từ 5,7, người ta cần thực hiện một dự án di chuyển.

Đầu tiên, bạn cần phân tích Schemata của mình và tìm ra cột nào trong UTF8MB4. Sau đó, bạn cần phải xem xét một số & nbsp; các thuộc tính của các cột này.

Chìa khóa

Các bảng Innodb có chiều dài khóa tối đa là 3072 byte. Giá trị này phụ thuộc vào định dạng hàng Innodb & nbsp; và innodb_page_size, vì vậy bạn sẽ cần kiểm tra tài liệu & nbsp; để tìm ra giới hạn của bạn là gì nếu bạn không chạy với cài đặt mặc định & nbsp;

Một ký tự UTF8MB4 sử dụng 1-4 byte, có nghĩa là độ dài tối đa & nbsp; của cột char/varchar là khóa, sẽ là 767 ký tự. Vì vậy, nếu & nbsp; bạn có các cột varchar/char chính có độ dài lớn hơn 767 ký tự, bạn sẽ phải xem xét để rút ngắn độ dài, & nbsp; thay đổi thành văn bản hoặc thay đổi cài đặt innodb.

Chỉ số

Khi việc đối chiếu một cột thay đổi, ngay cả khi ký tự đặt vẫn giữ & nbsp; giống nhau, các chỉ số sẽ được tái tạo. Đối với khối lượng dữ liệu lớn, điều này có thể & nbsp; dành thời gian đáng kể và bảng sẽ bị khóa trong chỉ số & nbsp; tạo.

Những ràng buộc độc đáo

Vì các đối chiếu là khác nhau, việc thay đổi bộ ký tự của bảng & nbsp; có thể phá vỡ các ràng buộc duy nhất (khóa duy nhất hoặc khóa chính, v.v.). Ví dụ đơn giản nhất là nếu bạn có & nbsp; tạo một cột ký tự với các cài đặt mặc định trong MySQL 5.7, cột này sẽ có ký tự Latin1 có một lần nữa có mặc định & nbsp; Collation latin1_swedish_ci. Trong đối chiếu này, ’A,! =‘ Å, ‘A,! Nếu cột này được thay đổi thành UTF8MB4 có & NBSP; đối chiếu mặc định UTF8MB4_0900_AI_CI trong MySQL 8.0, ràng buộc độc đáo & NBSP; có thể bị phá vỡ, vì trong đối chiếu này, ’A Trong & nbsp; Tình huống này, bạn phải xem xét đối chiếu nào bạn thực sự muốn. Đối với & nbsp; dữ liệu Thụy Điển, một giải pháp thay thế có thể là utf8mb4_sv_0900_ai_ci, chia sẻ & nbsp; nhiều thuộc tính với Latin1_swedish_ci. Nhưng giải pháp chính xác sẽ & nbsp; phụ thuộc vào tập dữ liệu thực tế của bạn và nhu cầu của ứng dụng của bạn.latin1 which again has the default collation latin1_swedish_ci. In this collation, ‘a’ != ‘å’, ‘a’ != ‘ä’ and ‘o’ != ‘ö’. If this column is changed to utf8mb4 which has the default collation utf8mb4_0900_ai_ci in MySQL 8.0, unique constraint may be broken, since in this collation, ‘a’=’å’=’ä’ and ‘o’=ö’. In this situation, you must consider which collation you really want. For Swedish data, an alternative may be utf8mb4_sv_0900_ai_ci, which share many properties with latin1_swedish_ci. But the correct solution will depend on your actual data set and the needs of your application.

Để kiểm tra xem một cột V có ràng buộc duy nhất trong bảng T có thể chuyển đổi thành UTF8MB4 với một số đối chiếu hay không, bạn có thể & nbsp; làm:

with

& nbsp; & nbsp; & nbsp; & nbsp; được chuyển đổi dưới dạng (chọn Chuyển đổi (VUSING UTF8MB4)converted as(select convert(vusing utf8mb4)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; đối chiếu UTF8MB4_0900_AI_CI ASVFROMT),collate utf8mb4_0900_ai_ci asvfromt),

& NBSP;offending as(selectvfrom converted group byvhaving count(*)>1)

chọn Đếm (*) từ vi phạm;count(*)from offending;

Nếu kết quả lớn hơn 0, bạn phải thay đổi dữ liệu của mình hoặc & nbsp; chọn một đối chiếu phù hợp hơn cho dữ liệu của bạn.

Để kiểm tra cặp giá trị nào gây ra sự cố, bạn có thể & nbsp; làm:

with

& nbsp; & nbsp; & nbsp; & nbsp; được chuyển đổi dưới dạng (chọn Chuyển đổi (VUSING UTF8MB4)converted as(select convert(vusing utf8mb4)

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; đối chiếu UTF8MB4_0900_AI_CI ASVFROMT),collate utf8mb4_0900_ai_ci asvfromt),

& nbsp;offending as(selectvfrom converted group byvhaving count(*) >1),

& nbsp; & nbsp; & nbsp; & nbsp; saoduplicates as(select converted.vfrom converted join offending

& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;               where converted.v=offending.v)

Chọn *Từ các bản sao Asajoin trùng lặp ASBfrom duplicates asajoin duplicates asb

     wherea.v=b.vand    wherea.v=b.vand

& nbsp;   a.vcollate utf8mb4_bin>b.vcollate utf8mb4_bin;

Không có đối chiếu pad

Các đối chiếu UTF8MB4 UNICODE 9.0.0 mới không phải là đối chiếu PAD (trái ngược với các đối chiếu cũ là các đối chiếu không gian pad). Điều này & nbsp; có nghĩa là các không gian kéo dài trong các chuỗi sẽ có ý nghĩa đối với các cột Varchar & nbsp; Kiểm tra các đối chiếu MySQL là không gian pad và không có pad nào bằng cách làm:

chọn collation_name, pad_attribution từ thông tin_schema.collations;collation_name,pad_attribute from information_schema.collations;

Điều này có thể có ý nghĩa tùy thuộc vào ứng dụng của bạn và dữ liệu được lưu trữ.

Ví dụ nhỏ

Chúng ta hãy giả sử rằng chúng ta có bảng sau sau khi nâng cấp từ 5.7:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

mysql> hiển thị tạo các thành phố bảng;>show create table cities;

+--------+--------------------------

| Bảng & nbsp; & nbsp; | Tạo bảngTable  |Create Table

+--------+--------------------------

| Bảng & nbsp; & nbsp; | Tạo bảngcities|CREATE TABLE`cities`(

`name`varchar(1024)NOTNULL,name`varchar(1024)NOTNULL,

`population`int(11)DEFAULTNULL,population`int(11) DEFAULTNULL,

| Thành phố | Tạo bảng`cities` (KEY(`name`)

Khóa chính (`name`)ENGINE=InnoDB DEFAULTCHARSET=latin1

+--------+--------------------------

| Bảng & nbsp; & nbsp; | Tạo bảngrow in set(0.00sec)

| Thành phố | Tạo bảng`cities` (>select *from cities;

Khóa chính (`name`)

) Động cơ = Innodb Defaultcharset = Latin1name       |population|

Khóa chính (`name`)

) Động cơ = Innodb Defaultcharset = Latin1København  |    1246611|

1Row Inset (0,00 giây)Orebro     |     107380|

mysql> chọn *từ các thành phố;Oslo       |     666759|

+------------+------------+Stockholm  |     935619|

| Tên & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | Dân số |Örebro     |     107380|

| København & nbsp; & nbsp; | & nbsp; & nbsp; & nbsp; & nbsp; 1246611 |

| Orebro & nbsp; & nbsp; & nbsp; & nbsp; | & nbsp; & nbsp; & nbsp; & nbsp; 107380 |rows inset(0.00sec)

| Oslo & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | & nbsp; & nbsp; & nbsp; & nbsp; 666759 |

| Stockholm & nbsp; & nbsp; 935619 |>with converted as(select convert(name using utf8mb4)collate utf8mb4_0900_ai_ci asvfrom cities),offending as(selectvfrom converted group byvhaving count(*)>1)select count(*)from offending;

| Örebro & nbsp; & nbsp; & nbsp; & nbsp; | & nbsp; & nbsp; & nbsp; & nbsp; 107380 |

+------------+------------+count(*)|

| Örebro & nbsp; & nbsp; & nbsp; & nbsp; | & nbsp; & nbsp; & nbsp; & nbsp; 107380 |

+------------+------------+1        |

| Örebro & nbsp; & nbsp; & nbsp; & nbsp; | & nbsp; & nbsp; & nbsp; & nbsp; 107380 |

+------------+------------+row inset(0.01 sec)

5Rows inset (0,00 giây)>with converted as(select convert(name using utf8mb4)collate utf8mb4_0900_ai_ci asvfrom cities), offending as(selectvfrom converted group byvhaving count(*)>1),duplicates as(select converted.vfrom converted join offending where converted.v=offending.v)select *from duplicates asajoin duplicates asbwherea.v=b.vanda.vcollate utf8mb4_bin>b.vcollate utf8mb4_bin;

Nếu chúng tôi thực hiện kiểm tra trên bảng này, chúng tôi sẽ nhận được:

mysql> với được chuyển đổi AS (chọn Chuyển đổi (Tên sử dụng UTF8MB4) đối chiếu UTF8MB4_0900_AI_CI ASVFROM CITY), vi phạm dưới dạng (selectvfrom đã chuyển đổi nhóm ByVhaving Count (*)> 1) chọn số lượng (*) từ vi phạm;v       |v      |

Nếu chúng tôi thực hiện kiểm tra trên bảng này, chúng tôi sẽ nhận được:

mysql> với được chuyển đổi AS (chọn Chuyển đổi (Tên sử dụng UTF8MB4) đối chiếu UTF8MB4_0900_AI_CI ASVFROM CITY), vi phạm dưới dạng (selectvfrom đã chuyển đổi nhóm ByVhaving Count (*)> 1) chọn số lượng (*) từ vi phạm;Örebro  |Orebro|

Nếu chúng tôi thực hiện kiểm tra trên bảng này, chúng tôi sẽ nhận được:

mysql> với được chuyển đổi AS (chọn Chuyển đổi (Tên sử dụng UTF8MB4) đối chiếu UTF8MB4_0900_AI_CI ASVFROM CITY), vi phạm dưới dạng (selectvfrom đã chuyển đổi nhóm ByVhaving Count (*)> 1) chọn số lượng (*) từ vi phạm;

+----------+>alter table cities modify column name varchar(1024)charset utf8mb4;

| Đếm (*) |1062(23000):Duplicate entry'Örebro'forkey'PRIMARY'

| 1 & nbsp; & nbsp; & nbsp; & nbsp; & nbsp;

  1. 1Row Inset (0,01 giây)
  2. mysql> với chuyển đổi AS (chọn Chuyển đổi (Tên sử dụng UTF8MB4) đối chiếu UTF8MB4_0900_AI_CI ASVFROM CITY), vi phạm là (selectvfrom đã chuyển đổi nhóm ByVhaving (*)> 1) .v) Chọn *từ các bản sao Asajoin sao chép Asbwherea.v = B.Vanda.vcollate UTF8MB4_BIN> B.VCOLLATE UTF8MB4_BIN;

+---------+--------+

| v & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | v & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; |>alter table cities modify column name varchar(1024)collate utf8mb4_sv_0900_ai_ci;

| Örebro & nbsp; & nbsp; | orebro |1071(42000):Specified key was too long;max key length is3072bytes

Và nếu bạn chỉ cố gắng chuyển đổi cột, bạn sẽ nhận được như mong đợi:

mysql> thay đổi bảng thành phố sửa đổi tên cột Varchar (1024) Charset UTF8MB4;>alter table cities modify column name varchar(768)charset utf8mb4;

ERROR1062 (23000): Bản sao nhập cảnh 'OK,4rows affected(0.01 sec)

Records:5Duplicates:0Warnings:0:5Duplicates:0Warnings:0

Có một số cách có thể từ đây:東京 (Tokyo):

Bạn có thể giả sử rằng đây là dữ liệu Thụy Điển và chuyển đổi sang UTF8MB4_SV_0900_AI_CI (vì bản gốc có Latin1_swedish_ci) hoặc một đối chiếu phù hợp khác, tùy thuộc vào ứng dụng và dữ liệu.>insert into cities values('東京',13617445);

Có thể là có dữ liệu không chính xác (bảng không nên có một mục cho ‘Örebro, và một mục khác cho‘ Orebro,). Trong trường hợp đó, bạn cần dọn dẹp dữ liệu của bạn trước khi chuyển đổi.OK,1row affected(0.00sec)

| Thành phố | Tạo bảng`cities` (> select *from cities;

Khóa chính (`name`)

) Động cơ = Innodb Defaultcharset = Latin1name       |population|

Khóa chính (`name`)

| København & nbsp; & nbsp; | & nbsp; & nbsp; & nbsp; & nbsp; 1246611 |København  |    1246611 |

| Oslo & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; | & nbsp; & nbsp; & nbsp; & nbsp; 666759 |Oslo       |     666759|

| Örebro & nbsp; & nbsp; & nbsp; & nbsp; | & nbsp; & nbsp; & nbsp; & nbsp; 107380 |Örebro     |     107380|

| Stockholm & nbsp; & nbsp; 935619 |Stockholm  |     935619|

| & Nbsp; & nbsp; & nbsp; & nbsp; & nbsp; 13617445 |東京        |   13617445|

+------------+------------+

6Rows inset (0,00 giây)rows inset(0.00sec)

Sự kết luận

Blog này không có nghĩa là một hướng dẫn đầy đủ cho việc di chuyển, & nbsp; và các ví dụ có thể không mở rộng cho khối lượng dữ liệu khổng lồ, nhưng tôi hy vọng tôi đã làm sáng tỏ các vấn đề mà bạn có thể bị vướng vào & NBSP; khi bạn chuyển sang UTF8MB4.

Ngoài ra, vui lòng kiểm tra các bài đăng trước đó của chúng tôi phác thảo các cải tiến của chúng tôi đối với hỗ trợ UTF8 trong MySQL 8.0, bắt đầu với bài viết giới thiệu của chúng tôi trên Sushi = Bia.

Charset mặc định UTF8MB4 là gì?

Tags: Kiểu dữ liệu. Từ MySQL 8.0, UTF8MB4 là bộ ký tự mặc định và đối chiếu mặc định cho UTF8MB4 là UTF8MB4_0900_AI_CI.utf8mb4 is the default character set, and the default collation for utf8mb4 is utf8mb4_0900_ai_ci.

Các ký tự mặc định được đặt trong MySQL là gì?

Bộ và đối chiếu ký tự máy chủ MySQL mặc định là Latin1 và latin1_swedish_ci, nhưng bạn có thể chỉ định các bộ ký tự tại các cấp độ máy chủ, cơ sở dữ liệu, bảng, cột và chuỗi.latin1 and latin1_swedish_ci , but you can specify character sets at the server, database, table, column, and string literal levels.

Tôi nên sử dụng UTF8MB4 hoặc UTF

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.

Sự khác biệt giữa UTF8MB4 và UTF là gì

UTF-8 chỉ có thể lưu trữ các ký tự 1, 2 hoặc 3 byte, trong khi UTF8MB4 cũng có thể lưu trữ 4 ký tự byte.UTF-8 là một tập hợp các ký tự được đưa ra bởi UTF8MB4.. utf-8 is a subset of characters given by utf8mb4 .

Làm cách nào để thay đổi UTF8MB4 thành UTF

Để giải quyết vấn đề, hãy mở tệp SQL đã xuất, tìm kiếm và thay thế UTF8MB4 bằng UTF8, sau khi tìm kiếm đó và thay thế UTF8MB4_UNICODE_520_CI bằng UTF8_General_CI.Lưu tệp và nhập nó vào cơ sở dữ liệu của bạn.Sau đó, thay đổi WP-config.Tùy chọn Charset PHP cho UTF8 và phép thuật bắt đầu.open the exported SQL file, search and replace the utf8mb4 with utf8 , after that search and replace the utf8mb4_unicode_520_ci with utf8_general_ci . Save the file and import it into your database. After that, change the wp-config. php charset option to utf8 , and the magic starts.