Spec-Zone.ru › MySQL 5.7

10.2.1 Набор символов

Набор символов — это совокупность символов в наборе.

Строковые выражения имеют атрибут набора символов, который может принимать два значения:

  • ASCII: выражение может содержать только символы ASCII, то есть символы в диапазоне Юникода U+0000 до U+007F.

  • UNICODE: выражение может содержать символы в диапазоне Юникода U+0000 до U+10FFFF. Это включает символы в диапазоне основного многоязычного плана (BMP) (U+0000 до U+FFFF) и дополнительные символы за пределами диапазона BMP (U+10000 до U+10FFFF).

Диапазон ASCII является подмножеством диапазона UNICODE, поэтому строку с набором символов ASCII можно безопасно преобразовать в набор символов любой строки с набором символов UNICODE без потери информации. Она также может быть безопасно преобразована в любой набор символов, который является надмножеством набора символов ascii. (Все наборы символов MySQL являются надмножествами набора символов ascii за исключением набора swe7, который повторно использует некоторые знаки препинания для шведских символов с диакритическими знаками.)

Использование набора символов позволяет преобразовывать наборы символов в выражениях во многих случаях, когда MySQL в противном случае вернул бы ошибку “незаконная смесь кодировок”, когда правила принудительной кодировки кодировок недостаточно, чтобы разрешить неоднозначности. (Дополнительную информацию о принудительной кодировке см. в разделе Раздел 10.8.4, «Принудительная кодировка кодировок в выражениях».)

Следующее обсуждение предоставляет примеры выражений и их наборов символов, а также описывает, как использование набора символов изменяет оценку строковых выражений:

  • Набор символов для константы строки зависит от содержимого строки и может отличаться от набора символов строки. Рассмотрим эти операторы:

    SET NAMES utf8; SELECT 'abc';
    SELECT _utf8'def';
    SELECT N'MySQL';
    

    Хотя набор символов является utf8 в каждом из предыдущих случаев, строки фактически не содержат никаких символов за пределами диапазона ASCII, поэтому их набор символов является ASCII, а не UNICODE.

  • Столбец с набором символов ascii имеет набор символов ASCII из-за своего набора символов. В следующей таблице у c1 есть набор символов ASCII:

    CREATE TABLE t1 (c1 CHAR(1) CHARACTER SET ascii);
    

    Следующий пример иллюстрирует, как набор символов позволяет определить результат в случае, когда ошибка возникает без набора символов:

    CREATE TABLE t1 (
      c1 CHAR(1) CHARACTER SET latin1,
      c2 CHAR(1) CHARACTER SET ascii
    );
    INSERT INTO t1 VALUES ('a','b');
    SELECT CONCAT(c1,c2) FROM t1;
    

    Без набора символов возникает эта ошибка:

    ERROR 1267 (HY000): Illegal mix of collations (latin1_swedish_ci,IMPLICIT)
    and (ascii_general_ci,IMPLICIT) for operation 'concat'
    

    Используя набор символов, преобразование подмножества в надмножество (ascii до latin1) может произойти, и возвращается результат:

    +---------------+
    | CONCAT(c1,c2) |
    +---------------+
    | ab            |
    +---------------+
    
  • Функции с одним строковым аргументом наследуют набор символов своего аргумента. Результат UPPER(_utf8'abc') имеет набор символов ASCII, потому что его аргумент имеет набор символов ASCII. (Несмотря на вводную _utf8, строка 'abc' не содержит символов за пределами диапазона ASCII.)

  • Для функций, возвращающих строку, но не имеющих строковых аргументов и использующих character_set_connection в качестве набора символов результата, набор символов результата равен ASCII, если character_set_connection равен ascii, и UNICODE в противном случае:

    FORMAT(numeric_column, 4);
    

    Использование набора символов изменяет то, как MySQL оценивает следующий пример:

    SET NAMES ascii;
    CREATE TABLE t1 (a INT, b VARCHAR(10) CHARACTER SET latin1);
    INSERT INTO t1 VALUES (1,'b');
    SELECT CONCAT(FORMAT(a, 4), b) FROM t1;
    

    Без набора символов возникает эта ошибка:

    ERROR 1267 (HY000): Illegal mix of collations (ascii_general_ci,COERCIBLE)
    and (latin1_swedish_ci,IMPLICIT) for operation 'concat'
    

    С набором символов возвращается результат:

    +-------------------------+
    | CONCAT(FORMAT(a, 4), b) |
    +-------------------------+
    | 1.0000b                 |
    +-------------------------+
    
  • Функции с двумя или более строковыми аргументами используют набор символов “самого широкого” аргумента для набора символов результата, где UNICODE шире, чем ASCII. Рассмотрим следующие вызовы CONCAT():

    CONCAT(_ucs2 X'0041', _ucs2 X'0042')
    CONCAT(_ucs2 X'0041', _ucs2 X'00C2')
    

    Для первого вызова набор символов является ASCII, поскольку оба аргумента находятся в диапазоне ASCII. Для второго вызова набор символов является UNICODE, поскольку второй аргумент находится за пределами диапазона ASCII.

  • Набор символов для значений, возвращаемых функцией, определяется на основе набора символов только тех аргументов, которые влияют на набор символов и сортировку результата.

    IF(column1 < column2, 'smaller', 'greater')
    

    Набор символов результата является ASCII, поскольку у двух строковых аргументов (второго аргумента и третьего аргумента) оба набора символов ASCII. Первый аргумент не имеет значения для набора символов результата, даже если в выражении используются строковые значения.

© 2025 Oracle
Licensed under the GPLv2 License.
https://docs.oracle.com/cd/E17952_01/mysql-5.7-en/charset-repertoire.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API