# 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,但是还是出现了不知名的错误。所以决定把整个过程记录下来。
获取依赖:

  • 确保网络能够ping通
$ 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 <sql.h>
                  ^
compilation terminated.

在这里插入图片描述

1、unixODBC

简介

ODBC(Open Database Connect)是由Microsoft 公司于1991 年提出的一个开放的,用于访问数据库的统一接口规范。unixODBC的是为非Window平台的系统实现ODBC规范接口的中间件。

unixODBC 提供了Linux 对ODBC 的支持,但它只是一个 ODBC的管理器, 要连接实际的数据库还得提供这种数据库的 ODBC 驱动.

FreeTDS就是Linux 下 用于连接MS SQL Server 和 Sybase 的免费ODBC 驱动
注意, 必须先装 unixODBC, 再装 freetds

原理

在这里插入图片描述
专有名词:

  • 数据源:是ODBC与数据库之间建立连接的依据,包括数据源名称、数据源描述,数据库驱动程序、数据库服务器地址、数据库端口号、数据库名称等。
  • ODBC驱动程序:ODBC与数据库之间的接口
  • 驱动程序管理器:将应用程序对ODBC API的调用传递给正确的驱动程序,而驱动程序执行完操作之后得到结果返回给应用程序。
  • ODBC API:应用程序与ODBC之间的接口
  • ODBC管理器:管理数据源、驱动程序
    用户通过ODBC管理器配置数据源,并获得数据源名称,应用程序提供数据源名称给ODBC,ODBC以此建立与相应数据库的连接

参考

安装

1、源码安装

先下载最新的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下。

2、二进制安装

$ yum install unixODBC  unixODBC-devel

3、rmp安装

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 

3、查看

查看是否安装成功

]# 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

2、freedsTDS

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

连接mssql

直接连接

 /usr/local/freetds/bin/tsql -H 192.168.133.133 -p1433 -Usa -P123456 -Darguse

配置连接

  • 在 FreeTDS 的配置文件中添加指向具体数据库的访问信息
    修改/usr/local/etc/freetds.conf文件,添加如下内容:
$ 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

错误:configure: error: sql.h not found

  • ./configure --prefix=/usr/local/freetds --with-unixodbc=/usr/local/unixODBC-2.3.7 --enable-msdblib --with-tdsver=7.3 时出现问题:configure: error: sql.h not found
  • 1、修改confure
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
  • 2、配置
$ ./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
  • 3、生成软链接
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
  • 4、./configure --prefix=/usr/local/freetds --with-unixodbc=/usr/local/unixODBC-2.3.7 --enable-msdblib --with-tdsver=7.3

3、连接mssql

配置

  • 在/etc/odbcinst.ini (或者/usr/local/etc/odbcinst.ini) 中登记 FreeTDS 驱动
$ 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	# 驱动所在位置
  • 在/usr/local/etc/odbc.ini中配置DNS [或者修改/etc/odbc.ini]
[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> 

理论

两种ini文件

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下面

配置文件内容
/etc/odbcinst.ini

备注: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).

odbc.ini

以上转载自: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

Logo

更多推荐