Hướng dẫn mysql set connection collation - mysql đặt đối chiếu kết nối

Một kết nối của người Viking là những gì một chương trình khách hàng tạo ra khi kết nối với máy chủ, để bắt đầu một phiên trong đó nó tương tác với máy chủ. Máy khách gửi các câu lệnh SQL, chẳng hạn như truy vấn, qua kết nối phiên. Máy chủ gửi phản hồi, chẳng hạn như bộ kết quả hoặc thông báo lỗi, qua kết nối trở lại máy khách.connection is what a client program makes when it connects to the server, to begin a session within which it interacts with the server. The client sends SQL statements, such as queries, over the session connection. The server sends responses, such as result sets or error messages, over the connection back to the client.

  • Bộ ký tự kết nối và các biến hệ thống đối chiếu

  • Bộ nhân vật khách hàng không thể chấp nhận được

  • Cấu hình ký tự kết nối chương trình máy khách

  • Câu lệnh SQL cho cấu hình bộ ký tự kết nối

  • Xử lý lỗi bộ ký tự kết nối

Bộ ký tự kết nối và các biến hệ thống đối chiếu

Bộ nhân vật khách hàng không thể chấp nhận được

  • Cấu hình ký tự kết nối chương trình máy khách

  • Câu lệnh SQL cho cấu hình bộ ký tự kết nối

Xử lý lỗi bộ ký tự kết nối

Một số biến hệ thống bộ ký tự và đối chiếu liên quan đến tương tác của máy khách với máy chủ. Một số trong số này đã được đề cập trong các phần trước:

  • Các biến hệ thống

    SELECT * FROM performance_schema.session_variables
    WHERE VARIABLE_NAME IN (
      'character_set_client', 'character_set_connection',
      'character_set_results', 'collation_connection'
    ) ORDER BY VARIABLE_NAME;
    8 và
    SELECT * FROM performance_schema.session_variables
    WHERE VARIABLE_NAME IN (
      'character_set_client', 'character_set_connection',
      'character_set_results', 'collation_connection'
    ) ORDER BY VARIABLE_NAME;
    9 cho biết bộ và đối chiếu ký tự máy chủ. Xem Phần & NBSP; 10.3.2, Bộ ký tự máy chủ và bộ sưu tập của máy chủ.

    Các biến hệ thống

    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    0 và
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    1 chỉ ra bộ ký tự và đối chiếu của cơ sở dữ liệu mặc định. Xem Phần & NBSP; 10.3.3, Bộ ký tự cơ sở dữ liệu và đối chiếu.

  • Các biến hệ thống ký tự và đối chiếu bổ sung có liên quan đến việc xử lý lưu lượng truy cập cho kết nối giữa máy khách và máy chủ. Mỗi khách hàng có các biến hệ thống ký tự và đối chiếu liên quan đến kết nối cụ thể theo phiên. Các giá trị biến hệ thống phiên này được khởi tạo tại thời điểm kết nối, nhưng có thể được thay đổi trong phiên.

    Một số câu hỏi về bộ ký tự và xử lý đối chiếu cho các kết nối khách hàng có thể được trả lời theo các biến hệ thống:

    • Bộ ký tự nào là câu lệnh khi họ rời khỏi khách hàng?

    • Máy chủ lấy biến hệ thống

      SHOW SESSION VARIABLES LIKE 'character\_set\_%';
      SHOW SESSION VARIABLES LIKE 'collation\_%';
      2 để trở thành ký tự được đặt trong đó các câu lệnh được gửi bởi máy khách.

  • Bộ máy chủ nên dịch các câu lệnh là gì sau khi nhận được chúng?

    Để xác định điều này, máy chủ sử dụng các biến hệ thống

    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    3 và
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    4:

    Máy chủ chuyển đổi các câu lệnh được gửi bởi máy khách từ

    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    2 thành
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    3. Ngoại lệ: Đối với các chuỗi chữ có trình giới thiệu như
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    7 hoặc
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    8, người giới thiệu xác định bộ ký tự. Xem Phần & NBSP; 10.3.8, Bộ giới thiệu nhân vật của người Hồi giáo.

    SET character_set_results = NULL;
    SET character_set_results = binary;

    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    4 rất quan trọng để so sánh các chuỗi theo nghĩa đen. Để so sánh các chuỗi với các giá trị cột,
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    4 không quan trọng vì các cột có đối chiếu riêng của chúng, có mức độ đối chiếu cao hơn (xem Phần & NBSP; 10.8.4, sự ép buộc đối chiếu trong các biểu thức).

Bộ máy chủ nên dịch kết quả truy vấn nào trước khi giao chúng lại cho máy khách?

SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;

Biến hệ thống

ucs2
utf16
utf16le
utf32
1 cho biết ký tự được đặt trong đó máy chủ trả về truy vấn kết quả cho máy khách. Điều này bao gồm dữ liệu kết quả như giá trị cột, siêu dữ liệu kết quả như tên cột và thông báo lỗi.all character set and collation system variables:

SHOW SESSION VARIABLES LIKE 'character\_set\_%';
SHOW SESSION VARIABLES LIKE 'collation\_%';

Để nói với máy chủ không thực hiện chuyển đổi bộ kết quả hoặc thông báo lỗi, hãy đặt

ucs2
utf16
utf16le
utf32
1 thành
ucs2
utf16
utf16le
utf32
3 hoặc
ucs2
utf16
utf16le
utf32
4:for each connection to the server.

Bộ nhân vật khách hàng không thể chấp nhận được

Để biết thêm thông tin về các bộ ký tự và thông báo lỗi, hãy xem Phần & NBSP; 10.6, Thông báo lỗi của ký tự đặt ra.

ucs2
utf16
utf16le
utf32

Để xem các giá trị của các biến hệ thống ký tự và hệ thống đối chiếu áp dụng cho phiên hiện tại, hãy sử dụng câu lệnh này:

mysql> SET character_set_client = 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client'
can't be set to the value of 'ucs2'

Các câu lệnh đơn giản hơn sau cũng hiển thị các biến kết nối, nhưng cũng bao gồm các biến liên quan khác. Chúng có thể hữu ích để xem tất cả các biến hệ thống tập hợp và bộ đối chiếu:

  • Khách hàng có thể tinh chỉnh các cài đặt cho các biến này hoặc phụ thuộc vào mặc định (trong trường hợp đó, bạn có thể bỏ qua phần còn lại của phần này). Nếu bạn không sử dụng mặc định, bạn phải thay đổi cài đặt ký tự cho mỗi kết nối với máy chủ.mysql and mysqladmin.

  • Biến hệ thống

    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    2 không thể được đặt thành các bộ ký tự nhất định:

  • Cố gắng sử dụng bất kỳ bộ ký tự nào đó làm bộ ký tự máy khách tạo ra lỗi:

Cấu hình ký tự kết nối chương trình máy khách

Lỗi tương tự xảy ra nếu bất kỳ bộ ký tự nào được sử dụng trong các bối cảnh sau, tất cả đều dẫn đến nỗ lực đặt

SHOW SESSION VARIABLES LIKE 'character\_set\_%';
SHOW SESSION VARIABLES LIKE 'collation\_%';
2 cho bộ ký tự được đặt tên:

Nếu máy chủ không hỗ trợ bộ hoặc bộ đối chiếu ký tự được yêu cầu, nó sẽ quay trở lại sử dụng bộ và đối chiếu ký tự máy chủ để định cấu hình kết nối. Để biết thêm chi tiết về hành vi dự phòng này, hãy xem Xử lý lỗi ký tự kết nối.

MySQL, MySQLadmin, MySQLcheck, MySQLimport và MySQLShow khách hàng xác định ký tự mặc định được đặt để sử dụng như sau:mysql, mysqladmin, mysqlcheck, mysqlimport, and mysqlshow client programs determine the default character set to use as follows:

  • Trong trường hợp không có thông tin khác, mỗi máy khách sử dụng bộ ký tự mặc định được biên dịch, thường là

    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    5.

  • Mỗi máy khách có thể tự động tự động sử dụng ký tự dựa trên cài đặt hệ điều hành, chẳng hạn như giá trị của biến môi trường địa phương

    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    6 hoặc
    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    7 trên các hệ thống UNIX hoặc cài đặt trang mã trên các hệ thống Windows. Đối với các hệ thống mà locale có sẵn từ HĐH, máy khách sử dụng nó để đặt bộ ký tự mặc định thay vì sử dụng mặc định được biên dịch. Ví dụ: cài đặt
    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    6 thành
    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    9 khiến cho ký tự
    mysql_options(mysql,
                  MYSQL_SET_CHARSET_NAME,
                  MYSQL_AUTODETECT_CHARSET_NAME);
    0 được sử dụng. Do đó, người dùng có thể định cấu hình địa phương trong môi trường của họ để sử dụng bởi các máy khách MySQL.

    Bộ ký tự hệ điều hành được ánh xạ tới bộ ký tự MySQL gần nhất nếu không có khớp chính xác. Nếu máy khách không hỗ trợ bộ ký tự phù hợp, nó sẽ sử dụng mặc định được biên dịch. Ví dụ: bản đồ

    mysql_options(mysql,
                  MYSQL_SET_CHARSET_NAME,
                  MYSQL_AUTODETECT_CHARSET_NAME);
    1 và
    mysql_options(mysql,
                  MYSQL_SET_CHARSET_NAME,
                  MYSQL_AUTODETECT_CHARSET_NAME);
    2 đến
    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    5 và
    mysql_options(mysql,
                  MYSQL_SET_CHARSET_NAME,
                  MYSQL_AUTODETECT_CHARSET_NAME);
    4 không được hỗ trợ như một bộ ký tự kết nối, do đó, nó ánh xạ theo mặc định được biên dịch.

    Các ứng dụng C có thể sử dụng tự động tự động đặt ký tự dựa trên cài đặt HĐH bằng cách gọi

    mysql_options(mysql,
                  MYSQL_SET_CHARSET_NAME,
                  MYSQL_AUTODETECT_CHARSET_NAME);
    5 như sau trước khi kết nối với máy chủ:

    mysql_options(mysql,
                  MYSQL_SET_CHARSET_NAME,
                  MYSQL_AUTODETECT_CHARSET_NAME);
  • Mỗi máy khách hỗ trợ tùy chọn

    mysql_options(mysql,
                  MYSQL_SET_CHARSET_NAME,
                  MYSQL_AUTODETECT_CHARSET_NAME);
    6, cho phép người dùng chỉ định bộ ký tự được ghi đè lên bất kỳ mặc định nào mà máy khách xác định khác.

Với máy khách MySQL, để sử dụng một bộ ký tự khác với mặc định, bạn có thể thực hiện rõ ràng câu lệnh

mysql> SET character_set_client = 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client'
can't be set to the value of 'ucs2'
4 mỗi khi bạn kết nối với máy chủ (xem Cấu hình ký tự kết nối chương trình khách hàng). Để hoàn thành kết quả tương tự dễ dàng hơn, chỉ định bộ ký tự trong tệp tùy chọn của bạn. Ví dụ: cài đặt tệp tùy chọn sau thay đổi ba biến hệ thống đặt ký tự liên quan đến kết nối được đặt thành
mysql_options(mysql,
              MYSQL_SET_CHARSET_NAME,
              MYSQL_AUTODETECT_CHARSET_NAME);
0 mỗi khi bạn gọi mysql:mysql client, to use a character set different from the default, you could explicitly execute a
mysql> SET character_set_client = 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client'
can't be set to the value of 'ucs2'
4 statement every time you connect to the server (see Client Program Connection Character Set Configuration). To accomplish the same result more easily, specify the character set in your option file. For example, the following option file setting changes the three connection-related character set system variables set to
mysql_options(mysql,
              MYSQL_SET_CHARSET_NAME,
              MYSQL_AUTODETECT_CHARSET_NAME);
0 each time you invoke mysql:

[mysql]
default-character-set=koi8r

Nếu bạn đang sử dụng ứng dụng khách MySQL có bật kết nối tự động (không được khuyến nghị), nên sử dụng lệnh

mysql_options(mysql,
              MYSQL_SET_CHARSET_NAME,
              MYSQL_AUTODETECT_CHARSET_NAME);
9 thay vì
mysql> SET character_set_client = 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client'
can't be set to the value of 'ucs2'
4. Ví dụ:mysql client with auto-reconnect enabled (which is not recommended), it is preferable to use the
mysql_options(mysql,
              MYSQL_SET_CHARSET_NAME,
              MYSQL_AUTODETECT_CHARSET_NAME);
9 command rather than
mysql> SET character_set_client = 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client'
can't be set to the value of 'ucs2'
4. For example:

mysql> charset koi8r
Charset changed

Lệnh

mysql_options(mysql,
              MYSQL_SET_CHARSET_NAME,
              MYSQL_AUTODETECT_CHARSET_NAME);
9 đưa ra câu lệnh
mysql> SET character_set_client = 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client'
can't be set to the value of 'ucs2'
4 và cũng thay đổi bộ ký tự mặc định mà MySQL sử dụng khi kết nối lại sau khi kết nối đã giảm.mysql uses when it reconnects after the connection has dropped.

Khi các chương trình máy khách cấu hình, bạn cũng phải xem xét môi trường mà họ thực hiện. Xem Phần & NBSP; 10.5, Cấu hình ký tự ứng dụng Set và Collation.

Câu lệnh SQL cho cấu hình bộ ký tự kết nối

Sau khi một kết nối đã được thiết lập, khách hàng có thể thay đổi các biến hệ thống tập hợp và hệ thống đối chiếu cho phiên hiện tại. Các biến này có thể được thay đổi riêng lẻ bằng cách sử dụng các câu lệnh

[mysql]
default-character-set=koi8r
3, nhưng hai câu lệnh thuận tiện hơn ảnh hưởng đến các biến hệ thống tập hợp ký tự liên quan đến kết nối như một nhóm:

  • [mysql]
    default-character-set=koi8r
    4 '[đối chiếu'
    [mysql]
    default-character-set=koi8r
    5 ']]

    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    4 cho biết bộ khách hàng sử dụng ký tự nào để gửi các câu lệnh SQL đến máy chủ. Do đó,
    [mysql]
    default-character-set=koi8r
    7 nói với máy chủ, các tin nhắn đến trong tương lai từ máy khách này đang ở trong ký tự
    [mysql]
    default-character-set=koi8r
    8. Nó cũng chỉ định bộ ký tự rằng máy chủ nên sử dụng để gửi kết quả cho máy khách. .future incoming messages from this client are in character set
    [mysql]
    default-character-set=koi8r
    8.
    It also specifies the character set that the server should use for sending results back to the client. (For example, it indicates what character set to use for column values if you use a
    [mysql]
    default-character-set=koi8r
    9 statement that produces a result set.)

    Một tuyên bố

    ucs2
    utf16
    utf16le
    utf32
    8 'tương đương với ba câu này:

    SET character_set_client = charset_name;
    SET character_set_results = charset_name;
    SET character_set_connection = charset_name;

    Cài đặt

    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    3 thành
    mysql> charset koi8r
    Charset changed
    2 cũng ngầm đặt
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    4 thành đối chiếu mặc định cho
    mysql> charset koi8r
    Charset changed
    2. Nó là không cần thiết để thiết lập sự đối chiếu đó một cách rõ ràng. Để chỉ định một đối chiếu cụ thể để sử dụng cho
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    4, hãy thêm mệnh đề
    mysql> charset koi8r
    Charset changed
    6:

    SET NAMES 'charset_name' COLLATE 'collation_name'
  • Đặt bộ ký tự '

    mysql> charset koi8r
    Charset changed
    2''

    mysql> charset koi8r
    Charset changed
    8 tương tự như
    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    4 nhưng đặt
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    3 và
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    4 thành
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    0 và
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    1 (như đã đề cập trước đây, chỉ ra bộ ký tự và đối chiếu của cơ sở dữ liệu mặc định).

    Một câu lệnh SET SETLE

    mysql> charset koi8r
    Charset changed
    2 tương đương với ba câu này:SET CHARACTER SET
    mysql> charset koi8r
    Charset changed
    2
    statement is equivalent to these three statements:

    SELECT * FROM performance_schema.session_variables
    WHERE VARIABLE_NAME IN (
      'character_set_client', 'character_set_connection',
      'character_set_results', 'collation_connection'
    ) ORDER BY VARIABLE_NAME;
    0

    Cài đặt

    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    4 cũng hoàn toàn đặt
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    3 cho bộ ký tự được liên kết với đối chiếu (tương đương với việc thực thi
    SET character_set_client = charset_name;
    SET character_set_results = charset_name;
    SET character_set_connection = charset_name;
    7). Không cần thiết phải đặt
    SHOW SESSION VARIABLES LIKE 'character\_set\_%';
    SHOW SESSION VARIABLES LIKE 'collation\_%';
    3 một cách rõ ràng.

Ví dụ: Giả sử

SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;
9 được định nghĩa là
SET NAMES 'charset_name' COLLATE 'collation_name'
0. Nếu bạn không nói
mysql> SET character_set_client = 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client'
can't be set to the value of 'ucs2'
4 hoặc
mysql> charset koi8r
Charset changed
8, thì với
SET NAMES 'charset_name' COLLATE 'collation_name'
3, máy chủ sẽ gửi lại tất cả các giá trị cho
SET character_set_client = charset_name;
SET character_set_results = charset_name;
SET character_set_connection = charset_name;
9 bằng cách sử dụng bộ ký tự mà máy khách chỉ định khi kết nối. Mặt khác, nếu bạn nói
SET NAMES 'charset_name' COLLATE 'collation_name'
5 hoặc
SET NAMES 'charset_name' COLLATE 'collation_name'
6 Trước khi phát hành câu lệnh
[mysql]
default-character-set=koi8r
9, máy chủ sẽ chuyển đổi các giá trị
SET NAMES 'charset_name' COLLATE 'collation_name'
8 thành
SET NAMES 'charset_name' COLLATE 'collation_name'
9 ngay trước khi gửi kết quả. Chuyển đổi có thể bị mất cho các ký tự không có trong cả hai bộ ký tự.

Xử lý lỗi bộ ký tự kết nối

Cố gắng sử dụng một bộ hoặc đối chiếu ký tự kết nối không phù hợp có thể tạo ra lỗi hoặc khiến máy chủ quay trở lại bộ ký tự mặc định và đối chiếu cho một kết nối nhất định. Phần này mô tả các vấn đề có thể xảy ra khi định cấu hình bộ ký tự kết nối. Những vấn đề này có thể xảy ra khi thiết lập kết nối hoặc khi thay đổi bộ ký tự trong một kết nối đã được thiết lập.

  • Kết nối xử lý lỗi thời gian

  • Xử lý lỗi thời gian chạy

Kết nối xử lý lỗi thời gian

Xử lý lỗi thời gian chạy

SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
1

Một số bộ ký tự không thể được sử dụng làm bộ ký tự máy khách; Xem các bộ ký tự máy khách không thể chấp nhận được. Nếu bạn chỉ định một bộ ký tự hợp lệ nhưng không được phép làm bộ ký tự máy khách, máy chủ sẽ trả về lỗi:

SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
2

Nếu bạn chỉ định một bộ ký tự mà máy khách không nhận ra, nó sẽ tạo ra một lỗi:

SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
3

Nếu bạn chỉ định một bộ ký tự mà máy khách nhận ra nhưng máy chủ thì không, máy chủ sẽ quay trở lại bộ ký tự và đối chiếu mặc định của nó. Giả sử rằng máy chủ được cấu hình để sử dụng

SET NAMES 'charset_name' COLLATE 'collation_name'
9 và
SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
01 làm mặc định của nó và nó không nhận ra
SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
02 là một bộ ký tự hợp lệ. Một máy khách chỉ định
SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
03 có thể kết nối với máy chủ, nhưng bộ ký tự kết quả không phải là điều mà khách hàng muốn:

Bạn có thể thấy rằng các biến hệ thống kết nối đã được đặt để phản ánh một tập hợp và đối chiếu ký tự của

SET NAMES 'charset_name' COLLATE 'collation_name'
9 và
SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
01. Điều này xảy ra vì máy chủ không thể đáp ứng yêu cầu đặt ký tự máy khách và rơi vào mặc định của nó.

Trong trường hợp này, máy khách không thể sử dụng bộ ký tự mà nó muốn vì máy chủ không hỗ trợ nó. Máy khách phải sẵn sàng sử dụng một bộ ký tự khác hoặc kết nối với một máy chủ khác hỗ trợ bộ ký tự mong muốn.

SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
3

Vấn đề tương tự xảy ra trong bối cảnh tinh tế hơn: khi máy khách nói với máy chủ sử dụng bộ ký tự mà máy chủ nhận ra, nhưng đối chiếu mặc định cho ký tự đó được đặt ở phía máy khách không được biết ở phía máy chủ. Điều này xảy ra, ví dụ, khi máy khách MySQL 8.0 muốn kết nối với máy chủ MySQL 5.7 bằng cách sử dụng

mysql> SET character_set_client = 'ucs2';
ERROR 1231 (42000): Variable 'character_set_client'
can't be set to the value of 'ucs2'
5 làm nhân vật khách. Một máy khách chỉ định
SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
07 có thể kết nối với máy chủ. Tuy nhiên, như trong ví dụ trước, máy chủ rơi trở lại bộ ký tự và đối chiếu mặc định của nó, không phải những gì máy khách yêu cầu:

  • Tại sao điều này xảy ra? Rốt cuộc,

    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    5 được biết đến với máy khách 8.0 và máy chủ 5.7, vì vậy cả hai đều nhận ra nó. Để hiểu hành vi này, cần phải hiểu rằng khi máy khách nói với máy chủ, ký tự nào mà nó muốn sử dụng, nó thực sự cho máy chủ đối chiếu mặc định cho bộ ký tự đó. Do đó, hành vi nói trên xảy ra do sự kết hợp của các yếu tố:

  • Phân đối mặc định cho

    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    5 khác nhau giữa MySQL 5.7 và 8.0 (
    SELECT * FROM performance_schema.session_variables
    WHERE VARIABLE_NAME IN (
      'character_set_client', 'character_set_connection',
      'character_set_results', 'collation_connection'
    ) ORDER BY VARIABLE_NAME;
    10 cho 5.7,
    SELECT * FROM performance_schema.session_variables
    WHERE VARIABLE_NAME IN (
      'character_set_client', 'character_set_connection',
      'character_set_results', 'collation_connection'
    ) ORDER BY VARIABLE_NAME;
    11 cho 8.0).

  • Khi máy khách 8.0 yêu cầu một bộ ký tự là

    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    5, những gì nó gửi đến máy chủ là đối chiếu 8.0
    mysql> SET character_set_client = 'ucs2';
    ERROR 1231 (42000): Variable 'character_set_client'
    can't be set to the value of 'ucs2'
    5 mặc định; Đó là,
    SELECT * FROM performance_schema.session_variables
    WHERE VARIABLE_NAME IN (
      'character_set_client', 'character_set_connection',
      'character_set_results', 'collation_connection'
    ) ORDER BY VARIABLE_NAME;
    11.

  • SELECT * FROM performance_schema.session_variables
    WHERE VARIABLE_NAME IN (
      'character_set_client', 'character_set_connection',
      'character_set_results', 'collation_connection'
    ) ORDER BY VARIABLE_NAME;
    11 chỉ được triển khai kể từ MySQL 8.0, do đó, máy chủ 5.7 không nhận ra nó.

Vì máy chủ 5.7 không nhận ra

SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
11, nó không thể đáp ứng yêu cầu đặt ký tự của máy khách và quay trở lại bộ ký tự và đối chiếu mặc định của nó (
SET NAMES 'charset_name' COLLATE 'collation_name'
9 và
SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
01).

Xử lý lỗi thời gian chạy

Một số bộ ký tự không thể được sử dụng làm bộ ký tự máy khách; Xem các bộ ký tự máy khách không thể chấp nhận được. Nếu bạn chỉ định một bộ ký tự hợp lệ nhưng không được phép làm bộ ký tự máy khách, máy chủ sẽ trả về lỗi:

Xử lý lỗi thời gian chạy

SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
5

Một số bộ ký tự không thể được sử dụng làm bộ ký tự máy khách; Xem các bộ ký tự máy khách không thể chấp nhận được. Nếu bạn chỉ định một bộ ký tự hợp lệ nhưng không được phép làm bộ ký tự máy khách, máy chủ sẽ trả về lỗi:

SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
6

Nếu bạn chỉ định một bộ ký tự mà máy khách không nhận ra, nó sẽ tạo ra một lỗi:

Nếu bạn chỉ định một bộ ký tự mà máy khách nhận ra nhưng máy chủ thì không, máy chủ sẽ quay trở lại bộ ký tự và đối chiếu mặc định của nó. Giả sử rằng máy chủ được cấu hình để sử dụng

SET NAMES 'charset_name' COLLATE 'collation_name'
9 và
SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
01 làm mặc định của nó và nó không nhận ra
SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
02 là một bộ ký tự hợp lệ. Một máy khách chỉ định
SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
03 có thể kết nối với máy chủ, nhưng bộ ký tự kết quả không phải là điều mà khách hàng muốn:

SELECT * FROM performance_schema.session_variables
WHERE VARIABLE_NAME IN (
  'character_set_client', 'character_set_connection',
  'character_set_results', 'collation_connection'
) ORDER BY VARIABLE_NAME;
7