整体流程结构
先安装unixODBC
http://www.unixodbc.org/ 下载执行
1. copy the unixODBC-2.3.2.tar.gz file somewhere you can create files and directories
2. gunzip unixODBC*.tar.gz
3. tar xvf unixODBC*.tar
./configure
make
make install
完毕
export ODBCINI=/usr/local/etc/odbc.ini
export ODBCSYSINI=/usr/local/etc
unixODBC 提供了Linux 对ODBC 的支持,但它只是一个 ODBC的管理器, 要连接
实际的数据库还得提供这种数据库的 ODBC 驱动.
关于odbcinst.ini和odbc.ini的说明
参考:http://blog.chinaunix.net/uid-7240278-id-131816.html 这篇文章中提到了默认的odbcinst.ini的位置在/usr/local/etc,这是在安装unixODBC是产生的,可以通过odbcinst -j指令来查看其具体位置
However since beta 1.6 the location of the system files odbcinst.ini and odbc.ini are determined by the configure script. The default location is /usr/local/etc, and if a prefix is specified the location is {prefix}/etc. The location of the etc path can be broken out of the normal prefix tree by specifing --sysconfdir=DIR, so the following will expect the system files to be in the same location as pre 1.6 builds.
安装Connector/ODBC
下载:mysql-connector-odbc-5.1.12-linux-glibc2.5-x86-32bit.tar
或者对应的64位版本
复制到/usr/local/lib
在odbcinst.ini的Driver添加/usr/loacl/lib/libmyodbc5.so
在64位版本中libodbc5a.so libodbc5w.so分别表示ANSII和Unicode,根据情况自己选择作为Driver
复制到/usr/local/lib64
连接测试
运行:isql -v DNS USER PWD 查看是不是能连接上数据库
常见错误:
1 Can't open lib
[unixODBC][Driver Manager]Can't open lib '/usr/local/lib/libmyodbc5.so
这个吊问题搞了我三四天,周末也搭上了,最后搞的我跟外包的大哥诉苦,哎现在总算是搞定了。
先说整个事情的真像吧:我的odbc.ini指定了Driver 和Driver64但我以为Driver64不会用到所以就注释掉了,结果就一直提示找不到Driver指定的so。通过对比,逐步排查,我确定了原来是Driver64在起作用,所以讲对应的so拷贝了过来,就可以了。
总结,这是因为64位机使用了64位的so文件,
现在也有64位的Driver,也有32位的Driver,但还是提示
[01000][unixODBC][Driver Manager]Can't open lib '/usr/local/lib64/libmyodbc5w.so' : file not found
现在我又晕了,这次用libodbc5a.so 替换了libodbc5w.so,看来我这里适合使用ASII版本的。
2 Can't connect to
[unixODBC][MySQL][ODBC 5.3(w) Driver]Can't connect to local MySQL server through socket '/tmp/mysql.sock'
可能是网络问题,比如本机的虚拟机访问本主机的数据库就会出现这种情况另外参考:
http://blog.csdn.net/junchaox/article/details/7287137
连接不上还有可能是因为端口号写错了。我记得MysQL的端口号都是默认3306,上次连接电信内网就遇到有人故意设置成13306的,又搞了我半天才找到原因。后来才知道之所以改,是因为电信内部特殊的版本升级导致。
3 Duplicate entry '0' for key 'PRIMARY'
在插入数据的时候不满足主键唯一性,即重复插入相同主键值。先删对应的数据才能插入。
4 插入数据库速度过慢
每秒钟才十几条,有时候甚至是个位数,网上搜了一下,今天突然特别快了。每秒钟两百条左右。赶紧找下到底是哪里让速度变快了。
基本配置:unixODBC,otl,Linux服务器64位MySQL本机CentOS64位
经过修改各处参数发现:
(1)宏定义原来是:-fPIC -DOTL_ODBC -DOTL_ODBC_UNIX -DOTL_STL 用时:3.93 s
新定义是: -fPIC -DOTL_ODBC_UNIX -DOTL_ODBC_MYSQL -DOTL_STL 用时:2.67 s
新定义是原来定义速度的两倍,这说明,不同的宏对代码生成产生了影响
全部的宏定义在:http://otl.sourceforge.net/otl3_compile.htm
http://otl.sourceforge.net/otl3_compile.htm
Otl Examples
(2)数据库表结构
(3)字符编码,如果程序提交的数据字符编码和数据库内部的字符编码不一致,则需要转换花费时间
(4)http://www.2cto.com/database/201207/143556.html
(5)http://www.php100.com/html/webkaifa/database/Mysql/2011/0326/7789.html
MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。
(6)去掉表中的索引,索引的结构会让数据库的表操作在维护其结构的时候比较费时。所以建表的时候去掉索引。