27.3.4 Типы данных хранимых программ JavaScript и обработка аргументов
Большинство типов данных MySQL поддерживаются для входных и выходных аргументов хранимых программ MLE, а также для типов возвращаемых данных. Типы данных перечислены здесь:
-
Целые числа: Поддерживаются все варианты и псевдонимы целых типов данных MySQL, включая
TINYINT,SMALLINT,MEDIUMINT,INTиBIGINT.SIGNEDиUNSIGNEDподдерживаются для всех этих типов.BOOLиSERIALтакже поддерживаются и обрабатываются как целые типы. -
Строки: Поддерживаются типы строк
CHAR,VARCHAR,TEXTиBLOB.Эти типы поддерживаются так же, как и в сервере MySQL, с следующими исключениями:
Аргументы и возвращаемые значения строкового типа могут использовать наборы символов
utf8mb4или двоичных символов; использование других наборов символов для этих целей приводит к ошибке. Это ограничение относится к объявлениям аргументов и типов возвращаемых значений; сервер пытается преобразовать значения аргументов значений используя другие наборы символов кutfmb4, когда это необходимо, как и в хранимых программах SQL.Максимальная поддерживаемая длина значения
LONGTEXTсоставляет 1073741799 (230 - 24 - 23 - 1) символов; дляLONGBLOBмаксимальная поддерживаемая длина составляет 2147483639 (231 - 28 - 1).
Поддержка типов
BLOBвключает поддержкуBINARYиVARBINARY.Тип данных MySQL
JSONтакже поддерживается. Числа с плавающей точкой:
FLOATиDOUBLEподдерживаются вместе с их псевдонимами.REALтакже рассматривается как число с плавающей точкой, ноUNSIGNED FLOATиUNSIGNED DOUBLEустарели в MySQL и не поддерживаются MLE.-
Временные типы:
DATE,DATETIMEиTIMESTAMPподдерживаются и преобразуются в значения JavaScriptDate. ЗначенияTIMEрассматриваются как строки; значенияYEARрассматриваются как числа.В первый раз при выполнении хранимой процедуры JavaScript, она ассоциируется с текущей часовой зоной сеанса MySQL, и эта часовая зона продолжает использоваться хранимой программой, даже если часовая зона сеанса MySQL изменяется одновременно, на протяжении всего сеанса компонента MLE или до вызова
mle_session_reset(). Более подробная информация находится в Поддержка часовых поясов в этой секции. VECTORподдерживается в MySQL 9.1 и более поздних версиях.
Входные аргументы (параметры IN и INOUT) автоматически преобразуются в типы JavaScript на основе отображения, показанного в следующей таблице:
Таблица 27.1 Преобразование типов: MySQL в JavaScript
| Тип MySQL | Тип JavaScript |
|---|---|
TINYINT, SMALLINT, MEDIUMINT, INT, BOOL, BIGINT или SERIAL
|
Если безопасно: Number; в противном случае: String
|
FLOAT или DOUBLE
|
Number |
CHAR, VARCHAR, TINYTEXT, TEXT, MEDIUMTEXT или LONGTEXT
|
String |
TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB, BINARY или VARBINARY
|
Uint8Array |
DATE, DATETIME или TIMESTAMP
|
Date |
TIME |
String |
YEAR |
Number |
VECTOR |
Float32Array |
Преобразование в или из целого числа MySQL, значение которого лежит вне диапазона -(253-1) (-9007199254740991) до 253-1 (9007199254740991) является потерей данных. Способ преобразования целых чисел MySQL в JavaScript можно изменить для текущего сеанса с помощью mle_set_session_state(); поведение по умолчанию эквивалентно вызову этой функции с использованием UNSAFE_STRING в качестве значения для integer_type. Подробнее см. описание этой функции.
SQL NULL поддерживается для всех перечисленных типов и преобразуется в JavaScript null по мере необходимости.
JavaScript (в отличие от SQL) — язык с динамической типизацией, что означает, что типы возвращаемых значений известны только во время выполнения. Возвращаемые значения JavaScript и выходные аргументы (параметры OUT и INOUT) автоматически преобразуются обратно в ожидаемый тип MySQL на основе отображений, показанных в следующей таблице:
Таблица 27.2 Преобразование типов: JavaScript в MySQL
| Тип данных JavaScript | Тип MySQL TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT, BOOLEAN или SERIAL
|
Тип MySQL CHAR или VARCHAR
|
Тип MySQL FLOAT или DOUBLE
|
Тип MySQL TINYTEXT, TEXT, MEDIUMTEXT или LONGTEXT
|
Тип MySQL TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB, BINARY, VARBINARY
|
Тип MySQL VECTOR
|
|---|---|---|---|---|---|---|
Boolean |
Приведение к типу Integer
|
Преобразование в String; проверка, находится ли длина результата в ожидаемом диапазоне |
Приведение к типу Float
|
Если JavaScript Boolean true: преобразовать в «true»; если JavaScript Boolean false: преобразовать в «false»
|
Ошибка | Ошибка |
Number |
Округление значения до Integer; проверка, не выходит ли значение за пределы диапазона [a] [b] [c]
|
Преобразование в String; проверка, находится ли длина результата в ожидаемом диапазоне |
Сохранение значения; проверка, не выходит ли оно за пределы диапазона [a] [b] | Преобразование в String; проверка, находится ли длина результата в ожидаемом диапазоне |
Ошибка | Ошибка |
BigInteger |
Сохранение значения; проверка, не выходит ли оно за пределы диапазона [a] [b] | Преобразование в String; проверка, находится ли длина результата в ожидаемом диапазоне |
Приведение к типу Float; проверка, не выходит ли результат за пределы диапазона [d]
|
Преобразование в String; проверка, находится ли длина результата в ожидаемом диапазоне |
Ошибка | Ошибка |
String |
Парсинг как число и округление до Integer; проверка на выход за пределы диапазона |
Сохранение значения; проверка, находится ли длина в допустимом диапазоне | Парсинг значения в Float; проверка на выход за пределы диапазона [d]
|
Использование существующего строкового значения; проверка, находится ли длина строки в ожидаемом диапазоне | Ошибка | Ошибка |
Symbol или Object
|
Возбуждение ошибки некорректного преобразования типа | Преобразование в String; проверка, находится ли длина результата в ожидаемом диапазоне |
Возбуждение ошибки некорректного преобразования типа | Преобразование в String; проверка, находится ли длина результата в ожидаемом диапазоне [e]
|
Ошибка | Ошибка |
Тип Array
|
Возбуждение ошибки некорректного преобразования типа | Преобразование в String; проверка, находится ли длина результата в ожидаемом диапазоне |
Возбуждение ошибки некорректного преобразования типа | Преобразование в String; проверка, находится ли длина результата в ожидаемом диапазоне [e]
|
Преобразование в массив байтов; проверка, находится ли результат в ожидаемом размере [f] | Обработка как Float32Array; преобразование в массив байтов, проверка соответствия ожидаемому размеру поля VECTOR |
null или undefined
|
NULL |
NULL |
NULL |
NULL |
NULL |
NULL |
[a] JavaScript Infinity и -Infinity рассматриваются как значения, выходящие за пределы диапазона.
[b] JavaScript NaN вызывает ошибку некорректного преобразования типа.
[c] Это делается с помощью Math.round().
[d] Нечисловое значение вызывает ошибку некорректного преобразования типа.
[e] Максимальная поддерживаемая длина строки — 1073741799
[f] Максимальная поддерживаемая длина BLOB — 2147483639
Таблица 27.3 Преобразование типов: JavaScript даты в MySQL
| Тип JavaScript | Тип MySQL DATE
|
Тип MySQL DATETIME, TIMESTAMP
|
Тип MySQL YEAR |
|---|---|---|---|
null или undefined
|
NULL |
NULL |
NULL |
Date |
Сохранение значения без изменений, округление любой временной части до ближайшей секунды. | Сохранение значения без изменений. | Извлечение года из Date
|
Тип, преобразуемый в JavaScript Date (форматированная строка) |
Приведение значения к JavaScript Date и обработка соответствующим образом |
Приведение значения к JavaScript Date и обработка соответствующим образом |
Если значение содержит 4-значный год, использовать его. |
Тип, не преобразуемый в JavaScript Date
|
Ошибка некорректного преобразования типа | Ошибка некорректного преобразования типа | Если значение содержит 4-значный год, использовать его. |
Передача нулевой даты MySQL (00-00-0000) или нулевого значения даты (например, 00-01-2023) приводит к созданию экземпляра Invalid Date типа Date. При передаче некорректной даты MySQL (например, 31 февраля), MLE вызывает конструктор JavaScript Date с некорректными значениями отдельных компонентов даты и времени.
Тип MySQL TIME обрабатывается как строка и валидируется внутри MySQL. Подробнее см. Раздел 13.2.3, «Тип TIME».
Таблица 27.4 Преобразование типов: MySQL JSON в JavaScript
| Тип MySQL JSON | Тип JavaScript |
|---|---|
NULL, JSON NULL
|
null |
JSON OBJECT |
Object |
JSON ARRAY |
Array |
JSON BOOLEAN |
Boolean |
JSON INTEGER, JSON DOUBLE, JSON DECIMAL
|
Number |
JSON STRING |
String [a]
|
JSON DATETIME, JSON DATE, JSON TIME
|
String |
JSON BLOB, JSON OPAQUE
|
String |
[a] Строка MySQL JSON, при преобразовании в строку Javascript, становится не заключенной в кавычки.
Таблица 27.5 Преобразование типов: JavaScript в MySQL JSON
| Тип JavaScript | Тип MySQL JSON |
|---|---|
null, undefined
|
NULL |
Boolean |
Ошибка [a] |
Number |
Ошибка [a] |
String |
|
BigInt |
Ошибка [b] |
Object |
JSON-объект или ошибка (см. текст после таблицы) |
Array |
JSON-массив |
Symbol |
|
[a] Значение внутри контейнера, такого как JSON-массив или JSON-объект, преобразуется (возможна потеря точности для Number значений). Скалярное значение вызывает ошибку.
[b] JavaScript BigInt значения не могут быть преобразованы в MySQL JSON; попытка такого преобразования всегда вызывает ошибку, независимо от того, находится ли значение внутри контейнера или нет.
Возможно или нет преобразование JavaScript Object в MySQL JSON, зависит от того, как toJSON() реализовано для данного объекта. Ниже приведены некоторые примеры:
Метод
toJSON()класса JavaScriptDateпреобразуетDateв строку с неверной синтаксической структурой JSON, что приводит к ошибке преобразования.Для класса
Set,toJSON()возвращает"{}", что является корректной JSON-строкой.Для объектов, похожих на JSON,
toJSON()возвращает корректную JSON-строку.
Преобразование из и в MySQL ENUM и SET. Поддержка типов MySQL ENUM и SET для аргументов JavaScript-программ доступна в MySQL 9.2.0 и более поздних версиях. ENUM преобразуется в JavaScript String; SET преобразуется в JavaScript Set объект, как показано в следующей таблице:
Таблица 27.6 Преобразование типов: MySQL ENUM и SET в JavaScript
В следующей таблице показаны правила преобразования типа JavaScript в тип MySQL ENUM или SET:
Таблица 27.7 Преобразование типов: JavaScript в MySQL ENUM и SET
| Тип JavaScript | В MySQL ENUM
|
В MySQL SET
|
|---|---|---|
| Строка | Сохранить значение; проверить, является ли строка допустимым значением ENUM |
Сохранить значение; проверить, является ли строка допустимым значением SET |
null, undefined
|
NULL |
NULL |
Set |
Ошибка | Преобразовать в строку, разделенную запятыми; проверить, является ли строка допустимым значением SET |
| Любой другой тип | Ошибка | Ошибка |
Дополнительные заметки
Все значения, используемые в или для
ENUMилиSETзначений или их JavaScript-эквивалентов, должны использовать набор символовutf8mb4. См. Раздел 12.9.1, «Набор символов utf8mb4 (4-байтовое кодирование UTF-8 Unicode)» для получения дополнительной информации.Режим сервера SQL может влиять на то, как обрабатывается неверное значение JavaScript при попытке вставки его в столбец
ENUMилиSET. В режиме строгости (по умолчанию) неверное значение вызывает ошибку; в противном случае вставляется пустая строка с предупреждением. См. Раздел 7.1.11, «Режимы сервера SQL».
Поддержка часовых поясов. JavaScript-хранимые программы используют часовой пояс MySQL, действующий в момент первого вызова. Этот часовой пояс остается в силе для этой хранимой программы на протяжении всего сеанса.
Изменение часового пояса сеанса MySQL не автоматически отражается в хранимых программах, которые уже использовались и кэшируются. Чтобы заставить их использовать новый часовой пояс, вызовите mle_session_reset() для очистки кэша; после этого хранимые программы будут использовать новый часовой пояс.
Поддерживаемые типы часовых поясов перечислены здесь:
Смещения часовых поясов от UTC, такие как
+11:00или-07:15.Часовые пояса, определённые в базе данных часовых поясов IANA, поддерживаются за исключением конфигураций, использующих високосные секунды. Например,
Pacific/Nauru,JapanиMETподдерживаются, в то время какleap/Pacific/Nauruиright/Pacific/Nauruнет.
Проверка диапазонов и проверка преобразования неверного типа выполняются после выполнения хранимой программы. Преобразование выполняется внутри JavaScript с помощью конструкторов типов, таких как Number() и String(); округление до Integer выполняется с помощью Math.round().
Входной аргумент (IN или INOUT параметр), указанный в определении хранимой JavaScript-программы, доступен внутри тела процедуры с тем же идентификатором аргумента. Выходные аргументы (INOUT и OUT параметры) также доступны в хранимых процедурах JavaScript. Тот же идентификатор аргумента может быть использован для установки значения с помощью оператора присваивания JavaScript (=). Как и в случае с аргументами SQL-хранимых процедур OUT, начальное значение устанавливается в JavaScript null.
Не следует переопределять аргументы программы с помощью let, var или const внутри хранимых JavaScript-программ. Это превращает их в переменные, локальные для программы, и делает недоступными любые значения, передаваемые в программу с использованием параметров с тем же именем.
Пример:
mysql> CREATE FUNCTION myfunc(x INT)
-> RETURNS INT LANGUAGE JAVASCRIPT AS
-> $$
$> var x
$>
$> return 2*x
$> $$
-> ;
Query OK, 0 rows affected (0.03 sec)
mysql> SELECT myfunc(10);
ERROR 6000 (HY000): MLE-Type> Cannot convert value 'NaN' to INT
from MLE in 'myfunc(10)'
Оператор JavaScript return должен использоваться для возвращения скалярных значений в хранимых функциях. В хранимых процедурах этот оператор не возвращает значение и просто завершает блок кода (это может или не может также завершить процедуру в зависимости от потока программы). return не может быть использован для установки значений аргументов хранимых процедур OUT или INOUT; они должны быть установлены явно в рамках процедуры.
Подробная информация о доступе к хранимым процедурам и функциям MySQL из хранимых JavaScript-процедур представлена в Разделе 27.3.6.8, «API хранимых процедур».
© 2025 Oracle
Licensed under the GPLv2 License.