mariadb與mysql非常像,甚至安裝mariadb後可以使用mysql指令運作mariadb。
安裝軟體
sudo apt install
我這裡安裝的是mariadb19。如果是mariadb18,請把下面的mariadb19換成mariadb18。
設定密碼
剛安裝是沒有密碼的。先設定密碼
sudo
mysql
UPDATE mysql.user SET plugin = 'mysql_native_password', Password = PASSWORD('a') WHERE User = 'root';
FLUSH PRIVILEGES;
這裡密碼設定成了
a
以後就可以使用
mysql -u root -p
登入了
安裝unixodbc
sudo apt install
測試一下是否安裝成功
odbcinst -j
成功:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5iN5kTMxEmNkljYmRGOwkDNzYzXzQTO1QTM0EzLcBTMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
失敗的話看參考連結。
安裝MariaDB Connector/ODBC
https://downloads.mariadb.org/connector-odbc/+releases/
這是目前的最新版本
然後cd到下載下傳目錄
mkdir mariadb-connector-odbc-3.1.6-ga-debian-x86_64
tar -zxvf mariadb-connector-odbc-3.1.6-ga-debian-x86_64.tar.gz -C mariadb-connector-odbc-3.1.6-ga-debian-x86_64
cd mariadb-connector-odbc-3.1.6-ga-debian-x86_64/lib
sudo cp
編輯/etc/odbcinst.ini
# Example driver definitions
# Driver from the postgresql-odbc package
# Setup from the unixODBC package
# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[mariadb]
Description = ODBC for mariadb
Driver = /usr/lib/x86_64-linux-gnu/mariadb19/libmaodbc.so
Setup = /usr/lib/x86_64-linux-gnu/mariadb19/libmaodbc.so
FileUsage = 1
這裡實際上是定義了一個叫做mariadb的driver。
編輯/etc/odbc.ini
[dbexp2]
Description = mariadb
Driver = mariadb
Server = 127.0.0.1
Port = 3306
USER = root
Password = a
CHARSET = UTF8
測試
isql dbexp2 -v
大機率會出錯。
[01000][unixODBC][Driver Manager]Can't open lib '/usr/lib/x86_64-linux-gnu/mariadb19/libmaodbc.so' : file not found
[ISQL]ERROR: Could not SQLConnect
其實是因為libmaodbc.so的依賴不滿足。
看看它的依賴:
ldd /usr/lib/x86_64-linux-gnu/mariadb19/libmaodbc.so
輸出:
linux-vdso.so.1 (0x00007ffe223e4000)
libodbcinst.so.2 => /lib/x86_64-linux-gnu/libodbcinst.so.2 (0x00007f78c000a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f78bfe87000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f78bfe82000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f78bfe61000)
libssl.so.1.0.0 => not found
libcrypto.so.1.0.0 => not found
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f78bfc9e000)
libltdl.so.7 => /lib/x86_64-linux-gnu/libltdl.so.7 (0x00007f78bfc93000)
/lib64/ld-linux-x86-64.so.2 (0x00007f78c04d0000)
可以看到找不到libssl.so.1.0.0和libcrypto.so.1.0.0。 再檢視依賴
linux-vdso.so.1 (0x00007fff634cb000)
libodbcinst.so.2 => /lib/x86_64-linux-gnu/libodbcinst.so.2 (0x00007fe427f12000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fe427d8f000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fe427d8a000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fe427d69000)
libssl.so.1.0.0 => /lib/x86_64-linux-gnu/libssl.so.1.0.0 (0x00007fe427b08000)
libcrypto.so.1.0.0 => /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 (0x00007fe42770b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe427548000)
libltdl.so.7 => /lib/x86_64-linux-gnu/libltdl.so.7 (0x00007fe42753d000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe4283d9000)
已經滿足了。
再跑一遍
isql dbexp2 -v
成功:
searchstar@searchstar-debian10-minimum:~/SetupFiles$ isql dbexp2 -v
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
在C/C++中使用
參考:先安裝頭檔案
sudo apt install
之後相關頭檔案就在
/usr/include/
下了。編譯的時候不需要用
-I
選項。
如果還需要mysql的頭檔案
sudo apt install
之後相關頭檔案就在
/usr/include/mysql
下了。編譯的時候需要用
-I"/usr/include/mysql"
,或者代碼裡頭檔案前加
mysql/
,例如
#include <mysql/mysql.h>
建議使用純odbc,以保證可移植性。
示例:
#include <iostream>
#include <sqlext.h>
using namespace std;
int main() {
sqlhenv serverhenv;
sqlhdbc serverhdbc;
sqlhstmt serverhstmt;
sqlreturn ret;
static sqlchar dname[45], dno[10];
sqllen length;
//配置設定環境句柄
ret = sqlallochandle(sql_handle_env,sql_null_handle,&serverhenv);
//設定環境屬性
ret = sqlsetenvattr(serverhenv,sql_attr_odbc_version,(void*)sql_ov_odbc3,0);
if(!sql_succeeded(ret))
{
cout<<"allocenvhandle error!"<<endl;
return 0;
}
//配置設定連接配接句柄
ret = sqlallochandle(sql_handle_dbc,serverhenv,&serverhdbc);
if(!sql_succeeded(ret))
{
cout<<"allocdbchandle error!"<<endl;
return 0;
}
//資料庫連接配接
ret = sqlconnect(serverhdbc,(sqlchar*)"dbexp2",sql_nts,(sqlchar*)"root",sql_nts,(sqlchar*)"a",sql_nts);//第二個參數是之前配置的資料源,後面是資料庫使用者名和密碼
if(!sql_succeeded(ret))
{
cout<<"sql_connect error!"<<endl;
return 0;
}
//配置設定執行語句句柄
ret = sqlallochandle(sql_handle_stmt,serverhdbc,&serverhstmt);
//執行sql語句
ret=sqlexecdirect(serverhstmt,(sqlchar*)"select dname, dno from company.department;",sql_nts);
if(ret == sql_success || ret == sql_success_with_info){
//綁定資料
sqlbindcol(serverhstmt,1, sql_c_char, (void*)dname,sizeof(dname), &length);
sqlbindcol(serverhstmt,2, sql_c_char, (void*)dno,sizeof(dno), &length);
//将光标移動到下行,即獲得下行資料
cout << "dname\t\tdno\n";
while(sql_no_data != sqlfetch(serverhstmt))
{
cout << dname << "\t\t" << dno << endl;
}
}
//釋放語句句柄
ret=sqlfreehandle(sql_handle_stmt,serverhstmt);
if(sql_success!=ret && sql_success_with_info != ret)
cout<<"free hstmt error!"<<endl;
//斷開資料庫連接配接
ret=sqldisconnect(serverhdbc);
if(sql_success!=ret&&sql_success_with_info!=ret)
cout<<"disconnected error!"<<endl;
//釋放連接配接句柄
ret=sqlfreehandle(sql_handle_dbc,serverhdbc);
if(sql_success!=ret&&sql_success_with_info!=ret)
cout<<"free hdbc error!"<<endl;
//釋放環境句柄句柄
ret=sqlfreehandle(sql_handle_env,serverhenv);
if(sql_success!=ret&&sql_success_with_info!=ret)
cout<<"free henv error!"<<endl;
cout << "done" << endl;
return 0;
}
因為之前資料源中已經定義了使用者名和密碼,是以這裡使用者名和密碼可以省掉,即
ret = sqlconnect(serverhdbc,(sqlchar*)"dbexp2",sql_nts,(sqlchar*)"root",sql_nts,(sqlchar*)"a",sql_nts);//第二個參數是之前配置的資料源,後面是資料庫使用者名和密碼
ret = SQLConnect(serverhdbc,(SQLCHAR*)"dbexp2",SQL_NTS, NULL, 0, NULL, 0);
g++ main.cpp -lodbc -o main
./main
dname dno
Economy Department 000
Sales Department 001
Human Resource Department 010
Produce Department 011
Research Department 100
done