Мне нужно хранить данные в базе данных. Я установил и настроил базу данных MySQL (и базу данных SQLite) в Matlab. Однако я не могу хранить и извлекать ничего, кроме скалярных числовых значений.
% create an empty database called test_data base with MySQL workbench.
% connect to it in Matlab
conn=database('test_database','root','XXXXXX','Vendor','MySQL');
% create a table to store values
create_test_table=['CREATE TABLE test_table (testID NUMERIC PRIMARY KEY, test_string VARCHAR(255), test_vector BLOB, test_scalar NUMERIC)'];
curs=exec(conn,create_test_table)
Результат до сих пор хорош (curs.Message - пустая строка)
% create a new record
datainsert(conn,'test_table',{'testID','test_string','test_vector','test_scalar'},{1,'string1',[1,2],1})
% try to read out the new record
sqlquery='SELECT * FROM test_table8';
data_to_view=fetch(conn,sqlquery)
Результат плохой:
data_to_view =
1 NaN NaN 1
Из документации для " извлечения " я ожидал бы:
data_to_view =
1×4 table
testID test_string test_vector test_scalar
_____________ ___________ ______________ ________
1 'string1' 1x2 double 1
Пока я не научусь читать капли, я бы даже согласился:
data_to_view =
1×4 table
testID test_string test_vector test_scalar
_____________ ___________ ______________ ________
1 'string1' NaN 1
Я получаю то же самое с базой данных sqlite. Как я могу хранить, а затем читать строки и капли, и почему данные не возвращаются в табличном формате?
Matlab не документирует, что параметры по умолчанию для поиска SQLite и MySQL - это попытка вернуть все как числовой массив. Это нужно только этой строке:
setdbprefs('DataReturnFormat','cellarray')
или же
setdbprefs('DataReturnFormat','table')
чтобы получить результаты с различными типами данных. Тем не мение! теперь мой результат:
data_to_view =
1×4 cell array
{[2]} {'string1'} {11×1 int8} {[1]}
Если вместо этого я ввожу:
datainsert(conn,'test_table',{'testID','test_string','test_vector','test_scalar'},{1,'string1',typecast([1,2],'int8'),1})
Затем я получаю:
data_to_view =
1×4 cell array
{[2]} {'string1'} {16×1 int8} {[1]}
который я могу преобразовать так: typecast (data_to_view {3}, 'double')
ans =
1 2
К сожалению, это не работает для SQLite. Я получил:
data_to_view =
1×4 cell array
{[2]} {'string1'} {' �? @'} {[1]}
и я не могу правильно преобразовать третью часть:
typecast(unicode2native(data_to_view{1,3}),'double')
ans =
0.0001 2.0000
Поэтому мне все еще нужно научиться читать SQLite blob в Matlab, но это другой вопрос.