#sql #anylogic
#sql #anylogic
Вопрос:
Я сохраняю выходные данные моей модели AnyLogic в базе данных SQL Server. Для не-поклонников AnyLogic AnyLogic основан на Java. Однако я не уверен, какие типы данных мне нужно указать для моих столбцов в базе данных.
Пока я использую эти:
- double в AnyLogic: float в SQL
- строка в AnyLogic: varchar в SQL
- int в AnyLogic: int в SQL
У меня также есть параметры, которые имеют тип Option list
, который, если я правильно понимаю, является формой Java enum . Я попытался сохранить эти параметры как varchar
, но это (очевидно) не работает. Кроме того, моя модель содержит различные логические параметры. Для моих логических параметров я добавляю столбцы типа bit
в SQL, выполнив:
ALTER TABLE myTable
ADD my_bool BIT NOT NULL DEFAULT 0;
Однако запуск модели возвращает эту ошибку
Исключение SQLServerException: недопустимое имя столбца ‘false’. Вызвано: недопустимое имя столбца ‘false’
Итак, конкретно, как я могу экспортировать параметры типа Option list
и boolean
?
Ответ №1:
Это касается исходного вопроса, который был помечен MySQL.
Я не знаю всех проблем, связанных со «списком опций». Похоже, что строка (с такой длиной, как varchar(255)
) будет работать. Вы также можете изучить встроенный enum
тип, хотя обычно я бы не рекомендовал использовать enum
s .
Я бы рекомендовал использовать boolean
вместо bit
как эквивалент для boolean
. Кажется более мнемоническим.
Тем не менее, MySQL понимает false
как константу. Вы можете проверить это, выполнив:
select false
Это тоже работает:
select "false"
Однако это возвращает указанную вами ошибку:
select `false`
Я подозреваю, что генерируемый код использует эту конструкцию. Вам нужно будет взглянуть на код — и, возможно, вам придется придумать какой-то другой способ справиться с этим. В MySQL вы можете использовать 0
for false
, и это может решить вашу проблему.
Комментарии:
1. Спасибо! Я думал, что mysql не поддерживает
boolean
типы данных. Я что-то недопонимаю? Varchar(255) не работает для параметров типаoption list
.2. Конечно, MySQL поддерживает логическое значение: dbfiddle.uk /. …
3. Прошу прощения, я использую не MySQL, а SQL server. SQL server не имеет логического типа данных.
Ответ №2:
База данных AnyLogic — это стандартная база данных HSQLDB (не что-то проприетарное), но они добавили функциональность клиента AnyLogic для определения «типов столбцов», как если бы они были типами Java (со специальными типами для списков опций и скомпилированного на лету и запущенного Java-кода).
Если вы посмотрите на db.script
файл (HSQLDB просто хранит постоянные данные БД в виде SQL-скрипта, который создает таблицы и вставляет значения), вы можете увидеть базовые типы HSQLDB, которые тесно связаны с типами SQL Server.
boolean --> BOOLEAN
double --> DOUBLE
int --> INT
String --> VARCHAR(16777216)
Date --> TIMESTAMP
Code --> VARCHAR(16777216)
Option List --> VARCHAR(255)
ПРИМЕЧАНИЕ: предполагается, что «типы столбцов Java» облегчают нетехническому пользователю понимание того, что они получат с точки зрения Java при запросе этого столбца, но, например, они сбивают с толку тем, что запросы будут возвращать Java nulls
для пропущенных значений, поэтому boolean
столбец фактически эффективно возвращает a Boolean
.
Это должно помочь.
Ответ №3:
Мне удалось решить часть моей проблемы. Теперь я могу хранить строковые переменные из Java в своей базе данных SQL. Проблема возникла из-за неправильного использования кавычек.
Java использует двойные кавычки для строковых переменных (например: ""
). SQL ожидает одинарных кавычек (например: ''
) для строковых столбцов, таких как varchar()
и char()
Мне пришлось изменить свой SQL-запрос на этот: String insertTableSQL = "INSERT INTO test (my_string) VALUES(" " '" my_variable_string "' )";
Обратите внимание, что my_variable_string
это производная от перечисления Java, которое я получил, выполнив String my_variable_string= my_enum.name();
Комментарии:
1. Да, для любого типа объекта вам нужен некоторый «примитивный» эквивалент в SQL Server, и стандартным подходом будет строковый эквивалент перечисления Java (список опций AnyLogic). (Очевидно, вам нужно добавить функциональность, чтобы преобразовать его обратно, если это необходимо.)