sql server链接mysql
【1】下载、安装mysql odbc驱动
驱动下载地址:http://dev.mysql.com/downloads/connector/odbc/
注意,版本要对应啊!!
要是mysql是5.7,你下载 8.0的 odbc 大概率会造成下面这种情况:
这种版本不对应,会导致只能插入和查询,无法删除和更新链接服务器mysql那边的表数据
类似下载界面情况如下:
【1.1】msi安装
老是会有各种依赖问题,恶心死了
直接下一步下一步就完事了,如果有问题见故障处理中的【1】【2】
【1.2】解压安装(推荐)
解压后:双击bat就好了
(如果没报错,可以不理会这行信息)如果实在太快,一闪而过,可以考虑如下图,在文件所有exit 字样的命令前面加上 timeout /t 10,就是等待十秒后再进行后面命令;
【1.3】核验是否装好odbc
管理工具-ODBC数据源-系统DSN-添加
如上图,出来了我们安装的 odbc 信息,这才算装好!
【2】配置odbc的 mysql 数据源
管理工具-ODBC数据源-系统DSN-添加-选择 MYSQL ODBC 5.3 Unicode DRIVER-完成
会跳出来MYSQL连接参数
Data Source Name:数据源名称
Decription:描述,随便写
Server:MYSQL服务器的IP
Port:MYSQL的端口,默认的是3306.可以改的.
User:连接账号(在mysql上授权的账号,同时给予相应权限)
Password:密码
Database:选择链接的数据库
填好之后,点下test.成功了则会如图跳出提示框.
(注意事项)操作一段后,再换字符集,可能会导致该链接服务器现有数据无法被更新和删除
修改后再 update/delete 链接服务器后的数据=》
错误信息如下:
链接服务器"mysql5_15"的 OLE DB 访问接口 "MSDASQL" 返回了消息 "无法为更新定位行。一些值可能已在最后一次读取后已更改。"。
消息 7343,级别 16,状态 4,第 1 行
链接服务器 "mysql5_15" 的 OLE DB 访问接口 "MSDASQL" 无法 UPDATE 表 "[MSDASQL]"。行集正在使用乐观并发机制,而自上次提取或重新同步包含列值的行后,该列值又有更改。
【3】在sql server添加链接服务器
打开SQL数据库,找到链接服务器.创建链接服务器,大家都会的,所以我就把参数发一下.如图,常规选项的其他的就不用填了.确定就行了.
这里,需要注意:访问接口要选择“Microsoft OLE DB Provider for ODBC Drivers”。
数据源:选择之前已创建好的ODBC接口。
【不建立OBDC源】
其实,也可以不建立ODBC数据源,直接建立链接服务器的,只要把[数据源]留空,而在[访问接口字符串]中填写链接字符串
“Driver={ MySQL ODBC 5.3 Unicode Driver };Server=127.0.0.1;Database=s_test; User=dlsyaim;Password=123456;Option=3;”即可。
然后在安全性中 选择使用此安全上下文创建连接 填写MYSQL 数据库的登陆名和密码
这里的账户密码密码,应该和【2】相同
【使用T-SQL实现】
--添加ODBC 链接服务器 EXEC sp_addlinkedserver @server = 'MySQL', @srvproduct='MySql' , @provider = 'MSDASQL', @provstr = 'Driver={MySQL ODBC 5.3 Driver}; Server=localhost; Database=test; User=root; Password=; Option=3;' --添加在sql server显示的登录名映射 EXEC sp_addlinkedsrvlogin @rmtsrvname='MySql' , --这个mysql就是上面建立的 @server名称 @useself='false' , @locallogin=null, @rmtuser='root' , --MySql登陆账号(root)密码 @rmtpassword=''
【4】sql 语句使用
【4.1】基本语句
–查询 SELECT * FROM OPENQUERY(MYSQL_DBLINK, ‘select * from tableName where id=”1”’) –修改 UPDATE OPENQUERY(MYSQL_DBLINK, ‘select * from tableName where id=”1”’) set cname=’测试’ –or UPDATE OPENQUERY(MYSQL_DBLINK, ‘select * from tableName ‘) set cname=’测试’ where id=1 –添加 INSERT INTO OPENQUERY(MYSQL_DBLINK, ‘select * from tableName where 1=0’)values (‘xx’,’xx’,’xx’); –删除 DELETE FROM OPENQUERY(MYSQL_DBLINK, ‘select * from tableName where id=”1”’)
【4.2】OPENQUERY用法
对给定的链接服务器执行指定的传递查询。该服务器是 OLE DB 数据源。OPENQUERY 可以在查询的 FROM 子句中引用,就好象它是一个表名。OPENQUERY 也可以作为 INSERT、UPDATE 或 DELETE 语句的目标表进行引用。但这要取决于 OLE DB 访问接口的功能。尽管查询可能返回多个结果集,但是 OPENQUERY 只返回第一个。
Transact-SQL 语法约定 语法 OPENQUERY ( linked_server ,’query’ ) 参数 linked_server 表示链接服务器名称的标识符。 ’ query ’ 在链接服务器中执行的查询字符串。该字符串的最大长度为 8 KB。 备注 OPENQUERY 不接受其参数的变量。 在 SQL Server 2000 和更高版本中,OPENQUERY 不能用于对链接服务器执行扩展存储过程。但是,通过使用四部分名称,可以在链接服务器上执行扩展存储过程。例如: EXEC SeattleSales.master.dbo.xp_msver 权限
任何用户都可以执行 OPENQUERY。用于连接到远程服务器的权限是从为链接服务器定义的设置中获取的
【5】字符集问题
(5.1)设定使用什么字符集连接mysql
**【注意】在查询的时候如果出现: 链接服务器 ‘MYSQL_DBLINK’ 的 OLE DB 访问接口 ‘MSDASQL’ 返回了对列 ‘[MSDASQL].cname’ 无效的数据。
需要在MYSQL ODBC数据源上设置符合你的编码格式,如图:
(5.2)最佳实践 烦人的字符集
odbc链接源=》默认字符集
插入到mysql后情况
(1)
表latin1
set names latin1
客户端 gb2312
重复1425行
重复行的意思就是:
select * from common_score where uid='吕'
就是这种离谱!
(2)
表 utf8
set names utf8
客户端 utf8
重复12行
(3)
表 utf8mb4
set names utf8mb4
客户端 utf8
重复12行
(5.3)最终使用 排序规则 collate utf8mb4_bin 解决中文编码问题
才彻底消除特殊中文字符的重复行;
CREATE TABLE `common_score_test_utf8mb4_bin` ( `areaid` tinyint(4) NOT NULL, `numid` int(11) NOT NULL, `uid` varchar(20) COLLATE utf8mb4_bin NOT NULL , `score` bigint(20) DEFAULT NULL, PRIMARY KEY (`numid`,`areaid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
utf8 ,使用 utf8_bin 排序规则前:
使用后,只有3行了
使用utf8mb4_bin 排序规则前
使用后: 如下图,最终成功
转自:https://blog.csdn.net/jsboy123/article/details/98496623
【错误处理】
【1】安装odbc报错:This application requires Visual Studio 2013 Redistributable
国内相关问题解答真是少的一笔,一堆链接全是国外站点,最终还是在程序员bug解决圣地 stackoverflow 找到解决方案。地址如下:
问题原因大体是mysql自动安装的Visual C++ Redistributable 路径不对或者即使是x64的mysql识别的也是x86的安装路径,所以解决方案是从微软手动下载 Visual C++ Redistributable安装 ,简体中文微软官方下载路径为:
【2013】https://www.microsoft.com/zh-CN/download/details.aspx?id=40784
点击下载按钮并将vcredist_x64和vcredist_86都下载下来,先安装vcredist_x64后尝试重新安装mysql 5.7.20 ,假如依然报错,然后安装vcredist_x86后再次安装mysql 问题解决。
【2】找不到指定的模块 myodbc5s.dll
操作系统 windows server2008 r2
sql server2005 sp4
mysql 5.7.24
解决:
搞了半天不行,网上找了很多这个 dll,放到 c:\windows\system32 ,或者是什么 sysWOW64 之类的;还有注册该dll 什么的 都么米用;
最终解决办法;装了一个VS 2015-2019 ;然后直接装8.0的 odbc(注意,这种版本不对应,会导致只能插入和查询,无法删除和更新链接服务器mysql那边的表数据)
【3】链接服务器 "mysql_15" 的 OLE DB 访问接口 "MSDASQL" 无法 INSERT INTO 表 "[MSDASQL]"。未知的提供程序错误。
消息 7343,级别 16,状态 2,第 11 行
链接服务器 "mysql_15" 的 OLE DB 访问接口 "MSDASQL" 无法 INSERT INTO 表 "[MSDASQL]"。未知的提供程序错误。
这类问题一般主要是因为语句操作有误,看看是否语法有写错,是否主键冲突,唯一键冲突等等;