# cat /etc/os-release
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
背景:需要在linux下使用golang连接sqlserver2008,出现错误解决[unixODBC][Driver Manager]Data source name not found, and no default driver specified问题。然后我yum安装了unixODBC,但是还是出现了不知名的错误。所以决定把整个过程记录下来。
获取依赖:
$ go get -u github.com/gpmgo/gopm //加快下载包的速度
$ go get -u github.com/lunny/godbc
src/github.com/lunny/godbc/api/api_unix.go:13:18: fatal error: sql.h: No such file or directory
// #include
^
compilation terminated.
ODBC(Open Database Connect)是由Microsoft 公司于1991 年提出的一个开放的,用于访问数据库的统一接口规范。unixODBC的是为非Window平台的系统实现ODBC规范接口的中间件。
unixODBC 提供了Linux 对ODBC 的支持,但它只是一个 ODBC的管理器, 要连接实际的数据库还得提供这种数据库的 ODBC 驱动.
FreeTDS就是Linux 下 用于连接MS SQL Server 和 Sybase 的免费ODBC 驱动
注意, 必须先装 unixODBC, 再装 freetds
参考
先下载最新的unixODBC源码包(http://www.unixodbc.org )放到适合自己的目录下,比如:/usr/local,然后运行下述命令:
# tar zxvf unixODBC-2.3.7.tar.gz
# cd unixODBC-2.3.7/
# ./configure --prefix=/usr/local/unixODBC-2.3.7 --includedir=/usr/include --libdir=/usr/local/lib -bindir=/usr/bin --sysconfdir=/usr/local/etc
# make && make install
安装成功后,unixODBC所需的头文件都被安装到了/usr/inlucde下,编译好的库文件安装到了/usr/local/lib 下,与unixODBC相关的可执行文件安装到了/usr/bin下,配置文件放到了/usr/local/etc下。
$ yum install unixODBC unixODBC-devel
https://pkgs.org/download/unixODBC-devel
http://rpmfind.net/linux/rpm2html/search.php?query=unixODBC
uname -r
$ rpm -ivh unixODBC-devel-2.3.1-11.el7.x86_64.rpm
查看是否安装成功
]# isql --version
unixODBC 2.3.7
# which isql
/usr/bin/isql
# isql
**********************************************
* unixODBC - isql *
**********************************************
# odbcinst -j
unixODBC 2.3.7
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8
freeTDS官网地址:http://www.freetds.org/
FreeTDS是Unix 和Linux library的一个集合,通过FreeTDS可以连接到MicrosoftSQL Server 和 Sybase DB
# 当前为root权限
$ cd freetds-1.1.5/
# 查看当前支持的 tdsver 版本,选择对应支持的 MSSQL 版本
$ ./configure --help
--with-tdsver=VERSION TDS protocol version (5.0/7.1/7.2/7.3/7.4/auto)
# 重编译安装,注意 tdsver 版本
$ ./configure --prefix=/usr/local/freetds --with-unixodbc=/usr/local/unixODBC-2.3.7 --enable-msdblib --with-tdsver=7.3 [源码安装]
$ make && make install
--prefix=/usr/local/freetds FreeTDS的默认安装目录 /usr/local/freetds
--enable-msdblib 允许 Microsoft 的函数库
--with-tdsver=7.3 指定TDS的协议版本,不填写则默认5.0版,7.3支持MSSQL2008
/usr/local/freetds/bin/tsql -C
/usr/local/freetds/bin/tsql -H 192.168.133.133 -p1433 -Usa -P123456 -Darguse
$ sudo gedit /usr/local/freetds/etc/freetds.conf
[mssqlserver]
host = 192.168.133.133
port = 1433
tds version = 7.3
client charset = UTF-8
注意:
client charset,客户端软件可识别的字符集,必需大于或等于服务端数据库使用的字符集.
由于 UTF-8 是所由字符集的超集,因此设置为 UTF-8 总是可行的.此外, FreeTDS的client charset不能设置为 UTF16.
/usr/local/freetds/bin/tsql -Smssqlserver -U sa -P 123456
https://blog.csdn.net/zhizhengguan/article/details/89516455
vim ./configure
找到$with_unixodbc中的
test -r "$ODBC_INC/sql.h" || as_fn_error $? "sql.h not found" "$LINENO" 5
这段代码
修改成
test -r "$ODBC_INC/sql.h" || as_fn_error $? "$ODBC_INC/sql.h not found" "$LINENO" 5
$ ./configure --prefix=/usr/local/freetds --with-unixodbc=/usr/local/unixODBC-2.3.7 --enable-msdblib --with-tdsver=7.3
报错:configure: error: /usr/local/unixODBC-2.3.7/include/sql.h not found
ln -s /usr/local/unixODBC/include/sql.h /usr/local/unixODBC1/include/sql.h
ln -s /usr/include/sqlext.h /usr/local/unixODBC-2.3.7/include/sqlext.h
ln -s /usr/include/sqltypes.h /usr/local/unixODBC-2.3.7/include/sqltypes.h
ln -s /usr/include/sqlucode.h /usr/local/unixODBC-2.3.7/include/sqlucode.h
$ cat /usr/local/etc/odbcinst.ini
# Driver from FreeTDS package
# setup from FreeTDS package
[FreeTDS] # unixodbc驱动名称
Description=ODBC of FreeTDS for MS SQL 2008 # 简介
Driver=/usr/local/freetds/lib/libtdsodbc.so # 驱动所在位置
[ODBC Data Sources]
TEST2dsn= My second Test DSN
TEST3dsn= testststtsts
[TEST2dsn]
Driver = /usr/local/freetds/lib/libtdsodbc.so
Description = My Second Test DSN
Trace = No
Server = 192.168.133.133
Database = master
Port = 1433
TDS_Version = 7.3
[TEST3dsn]
Driver = /usr/local/freetds/lib/libtdsodbc.so
Description = My Second Test DSN
Trace = No
Server = 192.168.133.133
Database = master
Port = 1433
TDS_Version = 7.3
isql -v TEST2dsn sa 123456
+---------------------------------------+
| Connected! |
| |
| sql-statement |
| help [tablename] |
| quit |
| |
+---------------------------------------+
SQL>
ODBC会区分两种类型的ini文件。
系统ini文件能被所有用户访问,但是不能修改;用户ini文件则是针对特定用户的,并且能被该特定用户修改。
ODBC的系统文件是odbcinst.ini和odbc.ini。用户文件是~/.odbc.ini(注意开头.号),并包含在各自用户的home目录下。
系统文件odbcinst.ini包含对所有用户可访问的ODBC驱动信息;odbc.ini文件包含所有用户可访问的DSN信息。这些’系统DSN’对于如web服务器这样,不以真实用户身份运行的应用十分有用,因为这些程序不会有自己的home目录来存放.odbc.ini文件。
odbcinst.ini和odbc.ini文件默认放在/usr/local/etc下面。但由于现在能通过指定配置脚本的prefix来指定文件路径,所以如果在configure的时候指定的了prefix,则文件路径在{prefix}/etc下面
备注:unixODBC先天支持PostgreSQL和MYSQL者两个驱动
# cat odbc.ini
[PostgreSQL]
Description=ODBC for PostgreSQL
Driver=/usr/lib/psqlodbcw.so
Setup=/usr/lib/libodbcpsqlS.so
Driver64=/usr/lib64/psqlodbcw.so
Setup64=/usr/lib64/libodbcpsqlS.so
FileUsage=1
[MySQL]
Description=ODBC for MySQL
Driver=/usr/lib/libmyodbc5.so
Setup=/usr/lib/libodbcmyS.so
Driver64=/usr/lib64/libmyodbc5.so
Setup64=/usr/lib64/libodbcmyS.so
FileUsage=1
[PostgreSQL]是driver的名字,这里表明这是一个PostgreSQL driver。
Driver 和Setup路径指出ODBC driver和setup libs 的位置。
当我们使用ODBCConfig工具添加新的DSN时,会调用这个setup lib。但是由于现在我们是非GUI安装,所以其实可以不用管他。
Driver路径最为关键。当DSN调用SQLConnect或SQLDriverConnect时,driver manager会动态载入这些库。若这里指定到了错误的Driver,则DSN无法工作。
FileUsage由odbcinst 命令自己添加,所以如果你使用的是文本编辑器,则需要自己添加。
Threads
由于1.6版本之后添加了多线程支持,所以如果driver manager构建了多线程支持,则可以配置:
[PostgreSQL]
Description = PostgreSQL driver for Linux & Win32
Driver = /usr/local/lib/libodbcpsql.so
Setup = /usr/local/lib/libodbcpsqlS.so
Threading = 2
这项配置改变了默认的线程序列化等级(thread serialization level).
以上转载自:https://www.cnblogs.com/oDoraemon/p/5364271.html
参考:https://blog.csdn.net/foxgod/article/details/78748657
https://blog.csdn.net/qq_25549309/article/details/51555789
https://www.cnblogs.com/zlja/archive/2012/03/06/2449470.html
参考:https://www.cnblogs.com/zlja/archive/2012/03/06/2449470.html
https://blog.csdn.net/zhizhengguan/article/details/88777732