14.23 Разные функции
Таблица 14.33 Разные функции
| Имя | Описание |
|---|---|
ANY_VALUE() | Подавление отклонения значения ONLY_FULL_GROUP_BY |
BIN_TO_UUID() | Преобразование двоичного UUID в строку |
DEFAULT() | Возвращает значение по умолчанию для столбца таблицы |
GROUPING() | Различение строк супер-агрегата ROLLUP от обычных строк |
INET_ATON() | Возвращает числовое значение IP-адреса |
INET_NTOA() | Возвращает IP-адрес из числового значения |
IS_UUID() | Является ли аргумент корректным UUID |
NAME_CONST() | Присваивает столбцу заданное имя |
SLEEP() | Засыпание на заданное количество секунд |
UUID() | Возвращает универсальный уникальный идентификатор (UUID) |
UUID_SHORT() | Возвращает целочисленное значение универсального идентификатора |
UUID_TO_BIN() | Преобразование строкового UUID в двоичный |
VALUES() | Определение значений, которые будут использоваться во время INSERT |
-
Эта функция полезна для
GROUP BYзапросов, когда режим SQLONLY_FULL_GROUP_BYвключен, в случаях, когда MySQL отклоняет запрос, который вы знаете как корректный по причинам, которые MySQL не может определить. Значение и тип возвращаемого значения функции такие же, как значение и тип возвращаемого значения её аргумента, но результат функции не проверяется на соответствие режиму SQLONLY_FULL_GROUP_BY.Например, если
name— это столбец без индекса, следующий запрос не выполнится при включенном режимеONLY_FULL_GROUP_BY:mysql>
SELECT name, address, MAX(age) FROM t GROUP BY name;ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'mydb.t.address' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_byОшибка происходит, потому что
address— это столбец без агрегации, который не указан средиGROUP BYстолбцов и не функционально зависит от них. В результате, значениеaddressдля строк в каждой группеnameне определено однозначно. Существует несколько способов заставить MySQL принять запрос:Измените таблицу, чтобы сделать
nameпервичным ключом или уникальнымNOT NULLстолбцом. Это позволяет MySQL определить, чтоaddressфункционально зависит отname; то есть,addressоднозначно определяется поname. (Этот метод неприменим, еслиNULLдолжен быть допустимымnameзначением.)-
Используйте
ANY_VALUE()для ссылки наaddress:SELECT name, ANY_VALUE(address), MAX(age) FROM t GROUP BY name;
В этом случае MySQL игнорирует неопределённость значений
addressв каждой группеnameи принимает запрос. Это может быть полезно, если вам просто неважно, какое значение столбца без агрегации выбирается для каждой группы.ANY_VALUE()не является агрегатной функцией, в отличие от функций, таких какSUM()илиCOUNT(). Она просто подавляет проверку на неопределённость. Выключите
ONLY_FULL_GROUP_BY. Это эквивалентно использованиюANY_VALUE()с включеннымONLY_FULL_GROUP_BY, как описано в предыдущем пункте.
ANY_VALUE()также полезна, если функциональная зависимость существует между столбцами, но MySQL не может её определить. Следующий запрос корректен, потому чтоageфункционально зависит от столбца группировкиage-1, но MySQL этого не понимает и отклоняет запрос при включенномONLY_FULL_GROUP_BY:SELECT age FROM t GROUP BY age-1;
Чтобы заставить MySQL принять запрос, используйте
ANY_VALUE():SELECT ANY_VALUE(age) FROM t GROUP BY age-1;
ANY_VALUE()может быть использована для запросов, которые ссылаются на агрегатные функции в отсутствиеGROUP BY-запроса:mysql>
SELECT name, MAX(age) FROM t;ERROR 1140 (42000): In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'mydb.t.name'; this is incompatible with sql_mode=only_full_group_byБез
GROUP BYсуществует одна группа, и нет определённости, какое значениеnameвыбрать для группы.ANY_VALUE()говорит MySQL принять запрос:SELECT ANY_VALUE(name), MAX(age) FROM t;
Возможно, из-за некоторых свойств данного набора данных, вы знаете, что выбранный столбец без агрегации фактически функционально зависит от столбца группировки. Например, приложение может гарантировать уникальность одного столбца относительно другого. В этом случае использование
ANY_VALUE()для эффективно функционально зависимого столбца может иметь смысл.Для дополнительной информации см. Раздел 14.19.3, «Обработка GROUP BY в MySQL».
-
BIN_TO_UUID(,binary_uuid)BIN_TO_UUID(binary_uuid,swap_flag)BIN_TO_UUID()— это обратная функция дляUUID_TO_BIN(). Она преобразует двоичный UUID в строковый UUID и возвращает результат. Двоичное значение должно быть UUID в виде значенияVARBINARY(16). Возвращаемое значение — строка из пяти шестнадцатеричных чисел, разделенных дефисами. (Подробности о формате см. в описании функцииUUID().) Если аргумент UUID —NULL, возвращаемое значение —NULL. При любом недопустимом аргументе возникает ошибка.BIN_TO_UUID()принимает один или два аргумента:В одном аргументе используется двоичное значение UUID. Предполагается, что части времени низкого и высокого порядка UUID не поменяны местами. Результат строки имеет тот же порядок, что и двоичный аргумент.
-
В двух аргументах используется двоичное значение UUID и значение флага перестановки:
Если
swap_flagравно 0, двухаргументный вариант эквивалентен одноаргументному. Результат строки имеет тот же порядок, что и двоичный аргумент.Если
swap_flagравно 1, предполагается, что части времени низкого и высокого порядка UUID поменяны местами. Эти части возвращаются в исходное положение в результирующем значении.
Для примеров использования и информации о перестановке частей времени см. описание функции
UUID_TO_BIN(). -
Возвращает значение по умолчанию для столбца таблицы. Если у столбца нет значения по умолчанию, возникает ошибка.
Использование
DEFAULT(для указания значения по умолчанию для именованного столбца разрешено только для столбцов с литеральными значениями по умолчанию, а не для столбцов с выражениями по умолчанию.col_name)mysql>
UPDATE t SET i = DEFAULT(i)+1 WHERE id < 100; -
Форматирует число
Xв формате, подобном'#,###,###.##', округляя доDдесятичных знаков и возвращает результат в виде строки. Для получения подробной информации см. Раздел 14.8, «Строковые функции и операторы».
-
Для запросов, включающих модификатор
WITH ROLLUP, операцияROLLUPсоздаёт строки сверх-агрегированных результатов, гдеNULLпредставляет собой множество всех значений. ФункцияGROUPING()позволяет отличать значенияNULLв строках сверх-агрегированных результатов от значенийNULLв обычных сгруппированных строках.Функция
GROUPING()разрешена в списке выбора, в предложенииHAVINGи в предложенииORDER BY.Каждый аргумент функции
GROUPING()должен быть выражением, точно соответствующим выражению в предложенииGROUP BY. Выражение не может быть позиционным спецификатором. Для каждого выражения, функцияGROUPING()возвращает 1, если значение выражения в текущей строке являетсяNULL, представляющим сверх-агрегированное значение. В противном случае,GROUPING()возвращает 0, указывая, что значение выражения являетсяNULLдля обычной строки результата или не являетсяNULL.Предположим, что таблица
t1содержит эти строки, гдеNULLобозначает что-то вроде “другое” или “неизвестно”:mysql>
SELECT * FROM t1;+------+-------+----------+ | name | size | quantity | +------+-------+----------+ | ball | small | 10 | | ball | large | 20 | | ball | NULL | 5 | | hoop | small | 15 | | hoop | large | 5 | | hoop | NULL | 3 | +------+-------+----------+Сводка таблицы без
WITH ROLLUPвыглядит так:mysql>
SELECT name, size, SUM(quantity) AS quantityFROM t1GROUP BY name, size;+------+-------+----------+ | name | size | quantity | +------+-------+----------+ | ball | small | 10 | | ball | large | 20 | | ball | NULL | 5 | | hoop | small | 15 | | hoop | large | 5 | | hoop | NULL | 3 | +------+-------+----------+Результат содержит
NULLзначения, но они не представляют сверх-агрегированные строки, поскольку запрос не содержитWITH ROLLUP.Добавление
WITH ROLLUPсоздаёт строки сверх-агрегированного свода, содержащие дополнительныеNULLзначения. Однако, без сравнения с предыдущим результатом, трудно определить, какиеNULLзначения появляются в строках сверх-агрегированных результатов, а какие — в обычных сгруппированных строках:mysql>
SELECT name, size, SUM(quantity) AS quantityFROM t1GROUP BY name, size WITH ROLLUP;+------+-------+----------+ | name | size | quantity | +------+-------+----------+ | ball | NULL | 5 | | ball | large | 20 | | ball | small | 10 | | ball | NULL | 35 | | hoop | NULL | 3 | | hoop | large | 5 | | hoop | small | 15 | | hoop | NULL | 23 | | NULL | NULL | 58 | +------+-------+----------+Для различения значений
NULLв строках сверх-агрегированных результатов и в обычных сгруппированных строках используйтеGROUPING(), которая возвращает 1 только для значенийNULLсверх-агрегированных результатов:mysql>
SELECTname, size, SUM(quantity) AS quantity,GROUPING(name) AS grp_name,GROUPING(size) AS grp_sizeFROM t1GROUP BY name, size WITH ROLLUP;+------+-------+----------+----------+----------+ | name | size | quantity | grp_name | grp_size | +------+-------+----------+----------+----------+ | ball | NULL | 5 | 0 | 0 | | ball | large | 20 | 0 | 0 | | ball | small | 10 | 0 | 0 | | ball | NULL | 35 | 0 | 1 | | hoop | NULL | 3 | 0 | 0 | | hoop | large | 5 | 0 | 0 | | hoop | small | 15 | 0 | 0 | | hoop | NULL | 23 | 0 | 1 | | NULL | NULL | 58 | 1 | 1 | +------+-------+----------+----------+----------+Типичные применения функции
GROUPING():-
Замена метки для значений
NULLсверх-агрегированных результатов:mysql>
SELECTIF(GROUPING(name) = 1, 'All items', name) AS name,IF(GROUPING(size) = 1, 'All sizes', size) AS size,SUM(quantity) AS quantityFROM t1GROUP BY name, size WITH ROLLUP;+-----------+-----------+----------+ | name | size | quantity | +-----------+-----------+----------+ | ball | NULL | 5 | | ball | large | 20 | | ball | small | 10 | | ball | All sizes | 35 | | hoop | NULL | 3 | | hoop | large | 5 | | hoop | small | 15 | | hoop | All sizes | 23 | | All items | All sizes | 58 | +-----------+-----------+----------+ -
Возврат только строк сверх-агрегированных результатов, отфильтровав обычные сгруппированные строки:
mysql>
SELECT name, size, SUM(quantity) AS quantityFROM t1GROUP BY name, size WITH ROLLUPHAVING GROUPING(name) = 1 OR GROUPING(size) = 1;+------+------+----------+ | name | size | quantity | +------+------+----------+ | ball | NULL | 35 | | hoop | NULL | 23 | | NULL | NULL | 58 | +------+------+----------+
Функция
GROUPING()допускает несколько аргументов-выражений. В этом случае возвращаемое значениеGROUPING()представляет собой битовую маску, составленную из результатов для каждого выражения, где младший бит соответствует результату для правого выражения. Например, с тремя аргументами-выражениями,GROUPING(вычисляется так:expr1,expr2,expr3)result for GROUPING(
expr3) + result for GROUPING(expr2) << 1 + result for GROUPING(expr1) << 2Следующий запрос демонстрирует, как результаты
GROUPING()для отдельных аргументов объединяются при вызове с несколькими аргументами, чтобы получить значение битовой маски:mysql>
SELECTname, size, SUM(quantity) AS quantity,GROUPING(name) AS grp_name,GROUPING(size) AS grp_size,GROUPING(name, size) AS grp_allFROM t1GROUP BY name, size WITH ROLLUP;+------+-------+----------+----------+----------+---------+ | name | size | quantity | grp_name | grp_size | grp_all | +------+-------+----------+----------+----------+---------+ | ball | NULL | 5 | 0 | 0 | 0 | | ball | large | 20 | 0 | 0 | 0 | | ball | small | 10 | 0 | 0 | 0 | | ball | NULL | 35 | 0 | 1 | 1 | | hoop | NULL | 3 | 0 | 0 | 0 | | hoop | large | 5 | 0 | 0 | 0 | | hoop | small | 15 | 0 | 0 | 0 | | hoop | NULL | 23 | 0 | 1 | 1 | | NULL | NULL | 58 | 1 | 1 | 3 | +------+-------+----------+----------+----------+---------+При нескольких аргументах-выражениях, возвращаемое значение функции
GROUPING()отлично от нуля, если любое выражение представляет значение сверх-агрегированного результата. Синтаксис функцииGROUPING()с несколькими аргументами, таким образом, предоставляет более простой способ написания ранее показанного запроса, возвращающего только строки сверх-агрегированных результатов, используя один вызов функцииGROUPING()с несколькими аргументами вместо нескольких вызовов функции с одним аргументом:mysql>
SELECT name, size, SUM(quantity) AS quantityFROM t1GROUP BY name, size WITH ROLLUPHAVING GROUPING(name, size) <> 0;+------+------+----------+ | name | size | quantity | +------+------+----------+ | ball | NULL | 35 | | hoop | NULL | 23 | | NULL | NULL | 58 | +------+------+----------+Использование функции
GROUPING()ограничено следующим:-
Не используйте подзапросы
GROUP BYвыражения в качестве аргументов функцииGROUPING(), так как сопоставление может не выполниться. Например, сопоставление не выполняется для этого запроса:mysql>
SELECT GROUPING((SELECT MAX(name) FROM t1))FROM t1GROUP BY (SELECT MAX(name) FROM t1) WITH ROLLUP;ERROR 3580 (HY000): Argument #1 of GROUPING function is not in GROUP BY -
GROUP BYлитеральные выражения не должны использоваться в предложенииHAVINGв качестве аргументов функцииGROUPING(). Из-за различий в том, когда оптимизатор оцениваетGROUP BYиHAVING, сопоставление может быть успешным, но вычисление функцииGROUPING()не даёт ожидаемого результата. Рассмотрите этот запрос:SELECT a AS f1, 'w' AS f2 FROM t GROUP BY f1, f2 WITH ROLLUP HAVING GROUPING(f2) = 1;
Функция
GROUPING()оценивается раньше для литерального константного выражения, чем для предложенияHAVINGв целом и возвращает 0. Чтобы проверить, затрагивает ли подобный запрос, воспользуйтесьEXPLAINи ищитеImpossible havingв столбцеExtra.
Дополнительную информацию о
WITH ROLLUPи функцииGROUPING()см. в разделе 14.19.2, «Модификаторы GROUP BY». -
-
Принимая строковое представление IPv4-адреса сети в формате «точка-десятичная», возвращает целое число, представляющее числовое значение адреса в сетевом порядке байтов (big endian). Функция
INET_ATON()возвращаетNULL, если не понимает свой аргумент или еслиexprимеетNULLзначение.mysql>
SELECT INET_ATON('10.0.5.9');-> 167773449В этом примере возвращаемое значение вычисляется как 10×2563 + 0×2562 + 5×256 + 9.
Функция
INET_ATON()может или не может возвращать результат, отличный отNULL, для IP-адресов в сокращенном формате (таких как'127.1'как представление'127.0.0.1'). Из-за этого,INET_ATON()не следует использовать для таких адресов.ПримечаниеДля хранения значений, генерируемых функцией
INET_ATON(), используйте столбецINT UNSIGNEDвместо столбца типаINT, который является знаковым. Если вы используете знаковый столбец, значения, соответствующие IP-адресам, первый октет которых больше 127, не могут быть сохранены корректно. См. раздел 13.1.7, «Обработка значений, выходящих за пределы диапазона, и переполнения». -
Принимая числовой IPv4-адрес сети в сетевом порядке байтов, возвращает строковое представление адреса в формате «точка-десятичная» в наборе символов соединения. Функция
INET_NTOA()возвращаетNULL, если не понимает свой аргумент.mysql>
SELECT INET_NTOA(167773449);-> '10.0.5.9'
-
Принимая в качестве аргумента строковое представление IPv6 или IPv4 сетевого адреса, возвращает двоичную строку, представляющую числовое значение адреса в сетевом порядке байтов (big endian). Поскольку числовые форматы IPv6-адресов требуют больше байтов, чем наибольший целочисленный тип, представлением, возвращаемым этой функцией, является тип данных
VARBINARY:VARBINARY(16)для IPv6-адресов иVARBINARY(4)для IPv4-адресов. Если аргумент не является допустимым адресом или если онNULL,INET6_ATON()возвращаетNULL.В следующих примерах используется функция
HEX()для отображения результатаINET6_ATON()в удобочитаемой форме:mysql>
SELECT HEX(INET6_ATON('fdfe::5a55:caff:fefa:9089'));-> 'FDFE0000000000005A55CAFFFEFA9089' mysql>SELECT HEX(INET6_ATON('10.0.5.9'));-> '0A000509'INET6_ATON()соблюдает несколько ограничений на допустимые аргументы. Эти ограничения приведены в следующем списке вместе с примерами.Запрещено использование концевого идентификатора зоны, как в
fe80::3%1илиfe80::3%eth0.Запрещено использование концевой маски сети, как в
2001:45f:3:ba::/64или198.51.100.0/24.Для значений, представляющих IPv4-адреса, поддерживаются только бесклассовые адреса. Классовые адреса, такие как
198.51.1, отклоняются. Запрещено использование концевого номера порта, как в198.51.100.2:8080. Шестнадцатеричные числа в компонентах адреса также запрещены, как в198.0xa0.1.2. Восьмеричные числа не поддерживаются:198.51.010.1обрабатывается как198.51.10.1, а не как198.51.8.1. Эти ограничения на IPv4 также применяются к IPv6-адресам, содержащим части IPv4-адресов, такие как адреса IPv4-совместимые или IPv4-отображенные.
Для преобразования IPv4-адреса
expr, представленного в числовом формате как значениеINT, в IPv6-адрес, представленный в числовом формате как значениеVARBINARY, используйте это выражение:INET6_ATON(INET_NTOA(
expr))Например:
mysql>
SELECT HEX(INET6_ATON(INET_NTOA(167773449)));-> '0A000509'Если функция
INET6_ATON()вызывается из клиента mysql, двоичные строки отображаются в шестнадцатеричном формате в зависимости от значения параметра--binary-as-hex. Дополнительную информацию об этом параметре см. в Разделе 6.5.1, «mysql — The MySQL Command-Line Client». -
Принимая в качестве аргумента двоичную строку, представляющую IPv6 или IPv4 сетевой адрес в числовом формате, возвращает строковое представление адреса в строковом формате набора символов соединения. Если аргумент не является допустимым адресом или если он
NULL,INET6_NTOA()возвращаетNULL.INET6_NTOA()обладает следующими свойствами:Она не использует функции операционной системы для выполнения преобразований, поэтому выходная строка независима от платформы.
-
Длина возвращаемой строки имеет максимальное значение 39 (4 х 8 + 7). Учитывая это утверждение:
CREATE TABLE t AS SELECT INET6_NTOA(
expr) AS c1;Результирующая таблица будет иметь такое определение:
CREATE TABLE t (c1 VARCHAR(39) CHARACTER SET utf8mb3 DEFAULT NULL);
Возвращаемая строка использует строчные буквы для IPv6-адресов.
mysql>
SELECT INET6_NTOA(INET6_ATON('fdfe::5a55:caff:fefa:9089'));-> 'fdfe::5a55:caff:fefa:9089' mysql>SELECT INET6_NTOA(INET6_ATON('10.0.5.9'));-> '10.0.5.9' mysql>SELECT INET6_NTOA(UNHEX('FDFE0000000000005A55CAFFFEFA9089'));-> 'fdfe::5a55:caff:fefa:9089' mysql>SELECT INET6_NTOA(UNHEX('0A000509'));-> '10.0.5.9'Если функция
INET6_NTOA()вызывается из клиента mysql, двоичные строки отображаются в шестнадцатеричном формате в зависимости от значения параметра--binary-as-hex. Дополнительную информацию об этом параметре см. в Разделе 6.5.1, «mysql — The MySQL Command-Line Client». -
Возвращает 1, если аргумент является допустимым IPv4-адресом, указанным в виде строки, и 0 в противном случае. Возвращает
NULL, еслиexprявляетсяNULL.mysql>
SELECT IS_IPV4('10.0.5.9'), IS_IPV4('10.0.5.256');-> 1, 0Для данного аргумента, если
IS_IPV4()возвращает 1,INET_ATON()(иINET6_ATON()) возвращает не-NULL. Обратное утверждение неверно: в некоторых случаяхINET_ATON()возвращает не-NULL, когдаIS_IPV4()возвращает 0.Как подразумевается из предыдущих замечаний,
IS_IPV4()более строго, чемINET_ATON(), в отношении того, что представляет собой допустимый IPv4-адрес, поэтому может быть полезным для приложений, которым требуются строгие проверки на недопустимые значения. В качестве альтернативы используйтеINET6_ATON()для преобразования IPv4-адресов во внутренний формат и проверки на результатNULL(который указывает на недопустимый адрес).INET6_ATON()также настолько же строга, какIS_IPV4(), в отношении проверки IPv4-адресов. -
Эта функция принимает IPv6-адрес в числовом формате в виде двоичной строки, как возвращает
INET6_ATON(). Она возвращает 1, если аргумент является допустимым IPv4-совместимым IPv6-адресом, и 0 в противном случае (еслиexprявляетсяNULL, в этом случае функция возвращаетNULL). IPv4-совместимые адреса имеют вид::.ipv4_addressmysql>
SELECT IS_IPV4_COMPAT(INET6_ATON('::10.0.5.9'));-> 1 mysql>SELECT IS_IPV4_COMPAT(INET6_ATON('::ffff:10.0.5.9'));-> 0Часть IPv4 в IPv4-совместимом адресе также может быть представлена в шестнадцатеричном формате. Например,
198.51.100.1имеет такое шестнадцатеричное значение:mysql>
SELECT HEX(INET6_ATON('198.51.100.1'));-> 'C6336401'В IPv4-совместимой форме
::198.51.100.1эквивалентно::c0a8:0001или (без ведущих нулей)::c0a8:1mysql>
SELECT->IS_IPV4_COMPAT(INET6_ATON('::198.51.100.1')),->IS_IPV4_COMPAT(INET6_ATON('::c0a8:0001')),->IS_IPV4_COMPAT(INET6_ATON('::c0a8:1'));-> 1, 1, 1
-
Возвращает заданное значение. При использовании для создания столбца результата набора,
NAME_CONST()задаёт столбцу заданное имя. Аргументы должны быть константами.mysql>
SELECT NAME_CONST('myname', 14);+--------+ | myname | +--------+ | 14 | +--------+Данная функция предназначена только для внутреннего использования. Сервер использует её при записи инструкций из хранимых программ, содержащих ссылки на локальные переменные программы, как описано в Разделе 27.7, «Хранимая программа двоичного протоколирования». Вы можете увидеть эту функцию в выводе из mysqlbinlog.
Для ваших приложений вы можете получить точно такой же результат, как в приведённом примере, используя простое алиасирование, например так:
mysql>
SELECT 14 AS myname;+--------+ | myname | +--------+ | 14 | +--------+ 1 row in set (0.00 sec)Дополнительную информацию об алиасах столбцов см. в Разделе 15.2.13, «Инструкция SELECT».
-
Засыпает (пауза) на количество секунд, заданное аргументом
duration, затем возвращает 0. Длительность может иметь дробную часть. Если аргумент равенNULLили отрицателен,SLEEP()выдаёт предупреждение или ошибку в строгом режиме SQL.Когда sleep возвращает значение нормально (без прерывания), возвращается 0:
mysql>
SELECT SLEEP(1000);+-------------+ | SLEEP(1000) | +-------------+ | 0 | +-------------+Когда
SLEEP()является единственной вызываемой частью запроса, который прерывается, она возвращает 1, и сам запрос не возвращает ошибку. Это верно, как если запрос убит, так и если истекло время ожидания:-
Эта инструкция прерывается с помощью
KILL QUERYиз другой сессии:mysql>
SELECT SLEEP(1000);+-------------+ | SLEEP(1000) | +-------------+ | 1 | +-------------+ -
Эта инструкция прерывается из-за истечения времени ожидания:
mysql>
SELECT /*+ MAX_EXECUTION_TIME(1) */ SLEEP(1000);+-------------+ | SLEEP(1000) | +-------------+ | 1 | +-------------+
Если
SLEEP()является только частью запроса, который прерывается, запрос возвращает ошибку:-
Эта инструкция прерывается с помощью
KILL QUERYиз другой сессии:mysql>
SELECT 1 FROM t1 WHERE SLEEP(1000);ERROR 1317 (70100): Query execution was interrupted -
Эта инструкция прерывается из-за истечения времени ожидания:
mysql>
SELECT /*+ MAX_EXECUTION_TIME(1000) */ 1 FROM t1 WHERE SLEEP(1000);ERROR 3024 (HY000): Query execution was interrupted, maximum statement execution time exceeded
Эта функция небезопасна для репликации на основе инструкций. Предупреждение регистрируется, если вы используете эту функцию, когда
binlog_formatустановлено в значениеSTATEMENT. -
-
Возвращает универсальный уникальный идентификатор (UUID), сгенерированный в соответствии с RFC 4122, «“Универсальный уникальный идентификатор (UUID) простанство имён URN”» (http://www.ietf.org/rfc/rfc4122.txt).
UUID предназначен как число, глобально уникальное в пространстве и времени. Два вызова
UUID()ожидаются для генерации двух различных значений, даже если эти вызовы выполняются на двух отдельных устройствах, не подключённых друг к другу.ПредупреждениеХотя значения
UUID()предназначены для уникальности, они не обязательно являются неугадываемыми или непредсказуемыми. Если требуется непредсказуемость, значения UUID следует генерировать другим способом.UUID()возвращает значение, соответствующее версии UUID 1, как описано в RFC 4122. Значение — 128-битное число, представленное какutf8mb3строка из пяти шестнадцатеричных чисел в форматеaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee:Первые три числа генерируются из младшей, средней и старшей частей метки времени. Старшая часть также включает номер версии UUID.
Четвёртое число сохраняет временную уникальность на случай, если значение метки времени потеряет монотонность (например, из-за перехода на летнее/зимнее время).
-
Пятое число — это номер узла IEEE 802, который обеспечивает пространственную уникальность. Случайное число подставляется, если последний недоступен (например, потому что устройство хоста не имеет сетевой карты Ethernet или неизвестно, как найти MAC-адрес интерфейса на операционной системе хоста). В этом случае пространственная уникальность не гарантируется. Тем не менее, вероятность столкновения должна быть очень низкой.
MAC-адрес интерфейса учитывается только на FreeBSD, Linux и Windows. На других операционных системах MySQL использует случайное 48-битное число.
mysql>
SELECT UUID();-> '6ccd780c-baba-1026-9564-5b8c656024db'Для преобразования между строковым и двоичным значениями UUID используйте функции
UUID_TO_BIN()иBIN_TO_UUID(). Для проверки, является ли строка допустимым значением UUID, используйте функциюIS_UUID().Эта функция небезопасна для репликации на основе инструкций. Предупреждение регистрируется, если вы используете эту функцию, когда
binlog_formatустановлено в значениеSTATEMENT. -
Возвращает «короткий» универсальный идентификатор как 64-битное беззнаковое целое число. Значения, возвращаемые
UUID_SHORT(), отличаются от 128-битных идентификаторов в строковом формате, возвращаемых функциейUUID(), и имеют другие свойства уникальности. ЗначениеUUID_SHORT()гарантируется уникальным, если выполняются следующие условия:Значение
server_idтекущего сервера находится в диапазоне от 0 до 255 и уникально среди вашего набора серверов-источников и серверов-репликВы не устанавливаете время системы для хоста сервера между перезапусками mysqld
Вы вызываете
UUID_SHORT()в среднем менее 16 миллионов раз в секунду между перезапусками mysqld
Значение возвращаемое
UUID_SHORT(), конструируется таким образом:(server_id & 255) << 56 + (server_startup_time_in_seconds << 24) + incremented_variable++;
mysql>
SELECT UUID_SHORT();-> 92395783831158784ПримечаниеUUID_SHORT()не работает с репликацией на основе инструкций.
-
UUID_TO_BIN(,string_uuid)UUID_TO_BIN(string_uuid,swap_flag)Преобразует строковый UUID в двоичный UUID и возвращает результат. (Описание функции
IS_UUID()содержит список разрешенных форматов строковых UUID.) Возвращаемый двоичный UUID является значением типаVARBINARY(16). Если аргумент UUID имеет значениеNULL, возвращаемое значение равноNULL. Если какой-либо аргумент некорректен, произойдет ошибка.UUID_TO_BIN()принимает один или два аргумента:В одноаргументном варианте используется значение строкового UUID. Двоичный результат располагается в том же порядке, что и строковый аргумент.
-
В двухаргументном варианте используется значение строкового UUID и флаг:
Если
swap_flagравен 0, двухаргументный вариант эквивалентен одноаргументному. Двоичный результат располагается в том же порядке, что и строковый аргумент.Если
swap_flagравен 1, формат возвращаемого значения отличается: части time-low и time-high (первая и третья группы шестнадцатеричных цифр соответственно) меняются местами. Это перемещает более быстро меняющуюся часть вправо и может повысить эффективность индексирования, если результат хранится в индексированном столбце.
Перестановка частей time предполагает использование значений UUID версии 1, таких как генерируются функцией
UUID(). Для значений UUID, сгенерированных другими средствами, которые не соответствуют формату версии 1, перестановка частей time не приносит никакой пользы. Подробнее о формате версии 1 см. в описании функцииUUID().Предположим, у вас есть следующее значение строкового UUID:
mysql>
SET @uuid = '6ccd780c-baba-1026-9564-5b8c656024db';Для преобразования строкового UUID в двоичный с перестановкой или без нее используйте
UUID_TO_BIN():mysql>
SELECT HEX(UUID_TO_BIN(@uuid));+----------------------------------+ | HEX(UUID_TO_BIN(@uuid)) | +----------------------------------+ | 6CCD780CBABA102695645B8C656024DB | +----------------------------------+ mysql>SELECT HEX(UUID_TO_BIN(@uuid, 0));+----------------------------------+ | HEX(UUID_TO_BIN(@uuid, 0)) | +----------------------------------+ | 6CCD780CBABA102695645B8C656024DB | +----------------------------------+ mysql>SELECT HEX(UUID_TO_BIN(@uuid, 1));+----------------------------------+ | HEX(UUID_TO_BIN(@uuid, 1)) | +----------------------------------+ | 1026BABA6CCD780C95645B8C656024DB | +----------------------------------+Для преобразования двоичного UUID, возвращаемого функцией
UUID_TO_BIN(), в строковый UUID, используйте функциюBIN_TO_UUID(). Если вы генерируете двоичный UUID, вызвавUUID_TO_BIN()со вторым аргументом 1 для перестановки частей time, вы также должны передать второй аргумент 1 вBIN_TO_UUID(), чтобы разменять части time при преобразовании двоичного UUID обратно в строковый UUID:mysql>
SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid));+--------------------------------------+ | BIN_TO_UUID(UUID_TO_BIN(@uuid)) | +--------------------------------------+ | 6ccd780c-baba-1026-9564-5b8c656024db | +--------------------------------------+ mysql>SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,0),0);+--------------------------------------+ | BIN_TO_UUID(UUID_TO_BIN(@uuid,0),0) | +--------------------------------------+ | 6ccd780c-baba-1026-9564-5b8c656024db | +--------------------------------------+ mysql>SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,1),1);+--------------------------------------+ | BIN_TO_UUID(UUID_TO_BIN(@uuid,1),1) | +--------------------------------------+ | 6ccd780c-baba-1026-9564-5b8c656024db | +--------------------------------------+Если использование перестановки частей time не совпадает при преобразовании в обоих направлениях, исходный UUID не восстанавливается правильно:
mysql>
SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,0),1);+--------------------------------------+ | BIN_TO_UUID(UUID_TO_BIN(@uuid,0),1) | +--------------------------------------+ | baba1026-780c-6ccd-9564-5b8c656024db | +--------------------------------------+ mysql>SELECT BIN_TO_UUID(UUID_TO_BIN(@uuid,1),0);+--------------------------------------+ | BIN_TO_UUID(UUID_TO_BIN(@uuid,1),0) | +--------------------------------------+ | 1026baba-6ccd-780c-9564-5b8c656024db | +--------------------------------------+Если функция
UUID_TO_BIN()вызывается из клиентской программы mysql, двоичные строки отображаются с использованием шестнадцатеричного обозначения, в зависимости от значения опции--binary-as-hex. Дополнительную информацию об этой опции см. в разделе Раздел 6.5.1, «mysql — Клиентская программа командной строки MySQL». -
В операторе
INSERT ... ON DUPLICATE KEY UPDATEвы можете использовать функциюVALUES(в операторной частиcol_name)UPDATEдля обращения к значениям столбцов из частиINSERTоператора. Другими словами,VALUES(в оператореcol_name)UPDATEотносится к значениюcol_name, которое должно быть вставлено, если конфликт с дублирующимся ключом не произошел. Эта функция особенно полезна при вставке нескольких строк. ФункцияVALUES()имеет смысл только в оператореUPDATEчастиINSERTоператоров и возвращаетNULLв противном случае. См. Раздел 15.2.7.2, «Оператор INSERT ... ON DUPLICATE KEY UPDATE».mysql>
INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)->ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);ВажноЭто использование устарело и может быть удалено в будущих версиях MySQL. Вместо этого используйте псевдоним строки или псевдонимы строки и столбца. Дополнительную информацию и примеры см. в Разделе 15.2.7.2, «Оператор INSERT ... ON DUPLICATE KEY UPDATE».
© 2025 Oracle
Licensed under the GPLv2 License.