Đối chiếu MySQL_connection

Trong MariaDB, bộ ký tự mặc định là latin1 và đối chiếu mặc định là latin1_swedish_ci (tuy nhiên, điều này có thể khác ở một số bản phân phối, xem ví dụ Sự khác biệt trong MariaDB trong Debian). Cả bộ ký tự và đối chiếu đều có thể được chỉ định từ máy chủ cho đến cấp độ cột, cũng như cho các kết nối máy khách-máy chủ. Khi thay đổi bộ ký tự và không chỉ định đối chiếu, đối chiếu mặc định cho bộ ký tự mới luôn được sử dụng

Các bộ ký tự và đối chiếu luôn xếp tầng xuống, do đó, một cột không có đối chiếu được chỉ định sẽ tìm bảng mặc định, bảng cho cơ sở dữ liệu và cơ sở dữ liệu cho máy chủ. Do đó, có thể kiểm soát cực kỳ chi tiết đối với tất cả các bộ ký tự và đối chiếu được sử dụng trong dữ liệu của bạn

Có thể xem các đối chiếu mặc định cho mỗi bộ ký tự bằng câu lệnh SHOW COLLATION, chẳng hạn, để tìm đối chiếu mặc định cho bộ ký tự latin2

SHOW COLLATION LIKE 'latin2%';
+---------------------+---------+----+---------+----------+---------+
| Collation           | Charset | Id | Default | Compiled | Sortlen |
+---------------------+---------+----+---------+----------+---------+
| latin2_czech_cs     | latin2  |  2 |         | Yes      |       4 |
| latin2_general_ci   | latin2  |  9 | Yes     | Yes      |       1 |
| latin2_hungarian_ci | latin2  | 21 |         | Yes      |       1 |
| latin2_croatian_ci  | latin2  | 27 |         | Yes      |       1 |
| latin2_bin          | latin2  | 77 |         | Yes      |       1 |
+---------------------+---------+----+---------+----------+---------+

Cấp máy chủ

Biến hệ thống character_set_server có thể được sử dụng để thay đổi bộ ký tự máy chủ mặc định. Nó có thể được đặt cả khi khởi động hoặc động, bằng lệnh SET

SET character_set_server = 'latin2';

Tương tự, biến collation_server được sử dụng để đặt đối chiếu máy chủ mặc định

SET collation_server = 'latin2_czech_cs';

Cấp cơ sở dữ liệu

Các câu lệnh CREATE DATABASE và ALTER DATABASE có các mệnh đề đối chiếu và bộ ký tự tùy chọn. Nếu những thứ này bị bỏ đi, mặc định của máy chủ được sử dụng

CREATE DATABASE czech_slovak_names 
  CHARACTER SET = 'keybcs2'
  COLLATE = 'keybcs2_bin';
ALTER DATABASE czech_slovak_names COLLATE = 'keybcs2_general_ci';

Để xác định bộ ký tự mặc định được cơ sở dữ liệu sử dụng, hãy sử dụng

SHOW CREATE DATABASE czech_slovak_names;
+--------------------+--------------------------------------------------------------------------------+
| Database           | Create Database                                                                |
+--------------------+--------------------------------------------------------------------------------+
| czech_slovak_names | CREATE DATABASE `czech_slovak_names` /*!40100 DEFAULT CHARACTER SET keybcs2 */ |
+--------------------+--------------------------------------------------------------------------------+

hoặc cách khác, đối với bộ ký tự và đối chiếu

SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;
+--------------+--------------------+----------------------------+------------------------+----------+
| CATALOG_NAME | SCHEMA_NAME        | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH |
+--------------+--------------------+----------------------------+------------------------+----------+
| def          | czech_slovak_names | keybcs2                    | keybcs2_general_ci     | NULL     |
| def          | information_schema | utf8                       | utf8_general_ci        | NULL     |
| def          | mysql              | latin1                     | latin1_swedish_ci      | NULL     |
| def          | performance_schema | utf8                       | utf8_general_ci        | NULL     |
| def          | test               | latin1                     | latin1_swedish_ci      | NULL     |
+--------------+--------------------+----------------------------+------------------------+----------+

Cũng có thể chỉ định đối chiếu và vì mỗi đối chiếu chỉ áp dụng cho một bộ ký tự nên bộ ký tự được liên kết sẽ tự động được chỉ định

CREATE DATABASE danish_names COLLATE 'utf8_danish_ci';

SHOW CREATE DATABASE danish_names;
+--------------+----------------------------------------------------------------------------------------------+
| Database     | Create Database                                                                              |
+--------------+----------------------------------------------------------------------------------------------+
| danish_names | CREATE DATABASE `danish_names` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_danish_ci */ |
+--------------+----------------------------------------------------------------------------------------------+

Mặc dù có các biến hệ thống character_set_database và collation_database có thể được đặt động, nhưng chúng được sử dụng để xác định bộ ký tự và đối chiếu cho cơ sở dữ liệu mặc định và chỉ nên được đặt bởi máy chủ

Cấp độ bảng

Các câu lệnh CREATE TABLE và ALTER TABLE hỗ trợ các mệnh đề đối chiếu và bộ ký tự tùy chọn, một phần mở rộng MariaDB và MySQL cho SQL tiêu chuẩn

________số 8

Nếu không cung cấp bộ ký tự cũng như đối chiếu, giá trị mặc định của cơ sở dữ liệu sẽ được sử dụng. Nếu chỉ cung cấp bộ ký tự, đối chiếu mặc định cho bộ ký tự đó sẽ được sử dụng. Nếu chỉ cung cấp đối chiếu, thì bộ ký tự được liên kết sẽ được sử dụng. Xem Bộ ký tự được hỗ trợ và Bộ sưu tập

ALTER TABLE table_name
 CONVERT TO CHARACTER SET charset_name [COLLATE collation_name];

Nếu không cung cấp đối chiếu, đối chiếu sẽ được đặt thành đối chiếu mặc định cho bộ ký tự đó. Xem Bộ ký tự được hỗ trợ và Bộ sưu tập

Đối với các cột VARCHAR hoặc TEXT, CONVERT TO CHARACTER SET sẽ thay đổi loại dữ liệu nếu cần để đảm bảo cột mới đủ dài để lưu trữ nhiều ký tự như cột ban đầu

Ví dụ: cột văn bản ascii yêu cầu một byte đơn cho mỗi ký tự, vì vậy cột có thể chứa tối đa 65.535 ký tự. Nếu cột được chuyển đổi thành utf8, có thể cần 3 byte cho mỗi ký tự, vì vậy cột sẽ được chuyển đổi thành MEDIUMTEXT để có thể giữ cùng số lượng ký tự

CREATE DATABASE czech_slovak_names 
  CHARACTER SET = 'keybcs2'
  COLLATE = 'keybcs2_bin';
0 sẽ chuyển đổi các cột CHAR, VARCHAR và TEXT thành BINARY, VARBINARY và BLOB tương ứng và từ thời điểm đó sẽ không còn bộ ký tự hoặc bị ảnh hưởng bởi các câu lệnh
CREATE DATABASE czech_slovak_names 
  CHARACTER SET = 'keybcs2'
  COLLATE = 'keybcs2_bin';
1 trong tương lai

Để tránh thay đổi loại dữ liệu do

CREATE DATABASE czech_slovak_names 
  CHARACTER SET = 'keybcs2'
  COLLATE = 'keybcs2_bin';
1, thay vào đó hãy sử dụng
CREATE DATABASE czech_slovak_names 
  CHARACTER SET = 'keybcs2'
  COLLATE = 'keybcs2_bin';
3 trên các cột riêng lẻ. Ví dụ

SET character_set_server = 'latin2';
0

Cấp độ cột

Bộ ký tự và đối chiếu cũng có thể được chỉ định cho các cột là kiểu ký tự CHAR, TEXT hoặc VARCHAR. Các câu lệnh CREATE TABLE và ALTER TABLE hỗ trợ các mệnh đề đối chiếu và bộ ký tự tùy chọn cho mục đích này - không giống như các mệnh đề ở cấp độ bảng, các định nghĩa cấp độ cột là SQL chuẩn

SET character_set_server = 'latin2';
1

Nếu không cung cấp đối chiếu cũng như bộ ký tự, giá trị mặc định của bảng sẽ được sử dụng. Nếu chỉ bộ ký tự được chỉ định, thì bộ ký tự mặc định của bộ ký tự đó được sử dụng, trong khi nếu chỉ bộ ký tự được chỉ định, thì bộ ký tự được liên kết sẽ được sử dụng

Khi sử dụng ALTER TABLE để thay đổi bộ ký tự của cột, bạn cần đảm bảo bộ ký tự tương thích với dữ liệu của mình. MariaDB sẽ ánh xạ dữ liệu tốt nhất có thể, nhưng có thể mất dữ liệu nếu không cẩn thận

Câu lệnh SHOW CREATE TABLE hoặc cơ sở dữ liệu INFORMATION SCHEMA có thể được sử dụng để xác định các bộ ký tự và đối chiếu cột

SET character_set_server = 'latin2';
2____13

Tên tệp

Kể từ MariaDB 5. 1, biến hệ thống character_set_filesystem đã kiểm soát việc giải thích tên tệp được cung cấp dưới dạng chuỗi ký tự. Điều này ảnh hưởng đến các câu lệnh và chức năng sau

chữ

Theo mặc định, bộ ký tự và đối chiếu được sử dụng cho các chữ được xác định bởi các biến hệ thống character_set_connection và collation_connection. Tuy nhiên, chúng cũng có thể được chỉ định rõ ràng

SET character_set_server = 'latin2';
4

Bộ ký tự của chuỗi ký tự không có phần giới thiệu bộ ký tự được xác định bởi biến hệ thống character_set_connection

truy vấn này

SET character_set_server = 'latin2';
5

luôn trả về cùng một tên bộ ký tự trong cả hai cột

character_set_client và character_set_connection bình thường (e. g. trong quá trình bắt tay hoặc sau truy vấn ĐẶT TÊN) được đặt thành các giá trị bằng nhau. Tuy nhiên, có thể đặt thành các giá trị khác nhau

ví dụ

Các ví dụ khi đặt @@character_set_client và @@character_set_connection thành các giá trị khác nhau có thể hữu ích

ví dụ 1

Giả sử, chúng ta có cơ sở dữ liệu utf8 với bảng này

SET character_set_server = 'latin2';
6

Bây giờ chúng tôi kết nối với nó bằng cách sử dụng "mysql. exe", sử dụng bộ ký tự DOS (cp850 trên máy Tây Âu) và muốn tìm nạp tất cả các bản ghi bằng 'ö' theo quy tắc danh bạ tiếng Đức

Có thể với những điều sau đây

SET character_set_server = 'latin2';
7

Điều này sẽ trở lại

SET character_set_server = 'latin2';
8

Nó hoạt động như sau

  1. Máy khách gửi truy vấn bằng cp850
  2. Máy chủ, khi phân tích truy vấn, tạo một chuỗi ký tự utf8 bằng cách chuyển đổi 'ö' từ @@character_set_client (cp850) thành @@character_set_connection (utf8)
  3. Máy chủ áp dụng đối chiếu "utf8_german2_ci" cho chuỗi ký tự này
  4. Máy chủ sử dụng utf8_german2_ci để so sánh

Lưu ý, nếu chúng ta viết lại kịch bản như thế này

SET character_set_server = 'latin2';
9

chúng ta sẽ gặp lỗi

SET collation_server = 'latin2_czech_cs';
0

tại vì

  • ở bước # 2, chữ không được chuyển đổi thành utf8 nữa và được tạo bằng cp850
  • ở bước #3, máy chủ không thể áp dụng utf8_german2_ci cho một chuỗi ký tự cp850

ví dụ 2

Giả sử chúng ta có cơ sở dữ liệu utf8 và sử dụng "mysql. exe" từ một máy Tây Âu một lần nữa

Chung ta co thể lam được việc nay

SET collation_server = 'latin2_czech_cs';
1

Nó sẽ tạo một bảng với một cột kiểu

CREATE DATABASE czech_slovak_names 
  CHARACTER SET = 'keybcs2'
  COLLATE = 'keybcs2_bin';
4

Lưu ý, nếu chúng ta viết lại truy vấn như thế này

SET collation_server = 'latin2_czech_cs';
2

Nó sẽ tạo một bảng có cột kiểu

CREATE DATABASE czech_slovak_names 
  CHARACTER SET = 'keybcs2'
  COLLATE = 'keybcs2_bin';
5, đây có lẽ không phải là một ý kiến ​​hay

N

Ngoài ra,

CREATE DATABASE czech_slovak_names 
  CHARACTER SET = 'keybcs2'
  COLLATE = 'keybcs2_bin';
6 hoặc
CREATE DATABASE czech_slovak_names 
  CHARACTER SET = 'keybcs2'
  COLLATE = 'keybcs2_bin';
7 có thể được sử dụng làm tiền tố để chuyển đổi một chữ thành bộ Ký tự Quốc gia (trong MariaDB luôn là utf8)

Ví dụ

SET collation_server = 'latin2_czech_cs';
3____24
SET collation_server = 'latin2_czech_cs';
5

Các chương trình và chế độ xem được lưu trữ

Theo mặc định, các chữ xuất hiện trong các chương trình và chế độ xem được lưu trữ sử dụng bộ ký tự và đối chiếu được chỉ định bởi các biến hệ thống character_set_connection và collation_connection khi chương trình được lưu trữ được tạo. Những giá trị này có thể được nhìn thấy bằng cách sử dụng câu lệnh SHOW CREATE. Để thay đổi bộ ký tự được sử dụng cho chữ trong chương trình được lưu trữ hiện có, cần phải xóa và tạo lại chương trình đã lưu trữ

Đối với các tham số thường trình được lưu trữ và giá trị trả về, một bộ ký tự và đối chiếu có thể được chỉ định thông qua các mệnh đề CHARACTER SET và COLLATE. trước 5. 5, chỉ định đối chiếu không được hỗ trợ

Ví dụ sau đây cho thấy bộ ký tự và đối chiếu được xác định tại thời điểm tạo

SET collation_server = 'latin2_czech_cs';
6

Ví dụ sau đây cho thấy cách chỉ định bộ ký tự và đối chiếu tham số chức năng

SET collation_server = 'latin2_czech_cs';
7

Hỗn hợp đối chiếu bất hợp pháp

MariaDB 10. 1. 28 - 10. 1. 29

Trong MariaDB 10. 1. 28, bạn có thể gặp phải Lỗi 1267 khi thực hiện thao tác so sánh trong dạng xem trên bảng sử dụng hằng số nhị phân. Ví dụ,

SET collation_server = 'latin2_czech_cs';
8

Khi truy vấn dạng xem được ghi vào tệp, MariaDB sẽ chuyển đổi ký tự nhị phân thành một chuỗi ký tự, khiến nó bị hiểu sai khi bạn thực thi câu lệnh

CREATE DATABASE czech_slovak_names 
  CHARACTER SET = 'keybcs2'
  COLLATE = 'keybcs2_bin';
8. Nếu bạn gặp sự cố này, hãy đặt bộ ký tự trong dạng xem để buộc nó thành giá trị bạn muốn

MariaDB đưa ra lỗi này do một lỗi đã được sửa trong MariaDB 10. 1. 29. Các bản phát hành sau này không gây ra lỗi trong tình huống này

Thí dụ. Thay đổi bộ ký tự mặc định thành UTF-8

Để thay đổi bộ ký tự mặc định từ latin1 sang UTF-8, các cài đặt sau phải được chỉ định trong my. tập tin cấu hình cnf

Đối chiếu MySQL là gì?

Đối chiếu là một bộ quy tắc xác định cách so sánh và sắp xếp các chuỗi ký tự . Mỗi đối chiếu trong MySQL thuộc về một bộ ký tự. Mỗi bộ ký tự có ít nhất một đối chiếu và hầu hết có hai hoặc nhiều đối chiếu. Một đối chiếu sắp xếp các ký tự dựa trên trọng số.

Liệu MySQL 5. 7 hỗ trợ utf8mb4_0900_ai_ci?

utf8mb4_0900_ai_ci chỉ được triển khai kể từ MySQL 8. 0 nên 5. 7 máy chủ không nhận ra nó . Bởi vì 5. 7 không nhận ra utf8mb4_0900_ai_ci , nó không thể đáp ứng yêu cầu bộ ký tự của máy khách và quay lại bộ ký tự và đối chiếu mặc định của nó ( latin1 và latin1_swedish_ci ).

Đối chiếu utf8mb4_0900_ai_ci là gì?

Ý nghĩa của đối chiếu MySQL utf8mb4_0900_ai_ci là gì? . 0900 đề cập đến phiên bản Thuật toán đối chiếu Unicode. each character is stored as a maximum of 4 bytes in the UTF-8 encoding scheme. 0900 refers to the Unicode Collation Algorithm version.

Sự khác biệt giữa utf8mb3 và utf8mb4 là gì?

utf8mb3 chỉ hỗ trợ các ký tự trong Mặt phẳng đa ngôn ngữ cơ bản (BMP). utf8mb4 hỗ trợ thêm các ký tự bổ sung nằm ngoài BMP . utf8mb3 sử dụng tối đa ba byte cho mỗi ký tự. utf8mb4 sử dụng tối đa bốn byte cho mỗi ký tự.