Типы данных SQL для AnyLogic

#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). (Очевидно, вам нужно добавить функциональность, чтобы преобразовать его обратно, если это необходимо.)