Spec-Zone .ru
спецификации, руководства, описания, API
|
Репертуар набора символов является набором символов в наборе.
У строковых выражений есть атрибут репертуара, у которого может быть два значения:
ASCII
: Выражение может содержать только символы в
диапазоне Unicode U+0000
к U+007F
.
UNICODE
: Выражение может содержать символы в диапазоне
Unicode U+0000
к U+FFFF
.
ASCII
диапазон является подмножеством UNICODE
диапазон,
таким образом, строка с ASCII
репертуар может быть преобразован безопасно без
потери информации к набору символов любой строки с UNICODE
репертуар или к набору
символов, который является надмножеством ASCII
. (Все наборы символов MySQL являются
надмножествами ASCII
за исключением swe7
, какие
повторные использования некоторые символы пунктуации для шведских символов с диакритическим знаком.)
Использование репертуара включает преобразованию набора символов в выражениях для многих случаев, куда MySQL
иначе возвратил бы "недопустимое соединение сопоставлений"
ошибка.
Следующее обсуждение обеспечивает примеры выражений и их репертуаров, и описывает, как использование изменений репертуара представляет вычисление выражения в виде строки:
Репертуар для строковых констант зависит от строкового контента:
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
репертуар.
Для функций, которые возвращают строку, но не имеют строковых параметров и
использования 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 0x0041, _ucs2 0x0042)CONCAT(_ucs2 0x0041, _ucs2 0x00C2)
Для первого вызова репертуар ASCII
потому что оба параметра в пределах
диапазона ascii
набор символов. Для второго вызова репертуар UNICODE
потому что второй параметр вне ascii
диапазон набора символов.
Репертуар для функциональных возвращаемых значений определяется базируемый только на репертуаре параметров, которые влияют на набор символов результата и сопоставление.
IF(column1 < column2, 'smaller', 'greater')
Репертуар результата ASCII
потому что два строковых параметра (второй
параметр и третий параметр) оба имеют ASCII
репертуар. Первый параметр
не имеет значения для репертуара результата, даже если выражение использует строковые значения.