一个坑

laravel处理sqlserver数据

公司有业务需要链接sqlserver处理数据,之前有搞通过,在mac下面,使用laravel,那时候还是php5,后来换了家公司,又有这方面需求,结果在ubuntu上整整搞了一天,用的是php71,这次彻底研究了下相关方面的知识,保存做记录

这里没有用docker,如果使用docker的朋友比较简单,有现成的laravel dockerfile,我之前用过,很好用

环境说明

  • Ubuntu 16.04.3 LTS
  • php7.1
  • laravel 5.5

第一步:安装php7.1

这里使用apt安装

1
2
3
4
5
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install php7.1
sudo apt install php7.1-common php7.1-fpm php7.1-dev
sudo apt install php7.1-mbstring php7.1-xml php7.1-curl

第二步:安装php相关扩展

1
sudo apt install php7.1-mbstring php7.1-xml php7.1-curl

第三步:安装mysql扩展

1
sudo apt install php7.1-mysql

装好之后,应该有3个扩展,mysqli,mysqlnd pdo_mysql

第四步:启用PDO

很多朋友不知道怎么管理php扩展,其实php在装好之后,很多扩展都已经装上了,只要启用就可以了,而启用的方法很简

1
sudo phpenmod pdo

PS: 如果要禁用这个扩展也很简单,根本不用卸载

1
sudo phpdismod pdo

具体的原理就自己去查好了

第五步:安装pdo_dblib

这是折腾我最长时间的一步,laravel就是用这个来连接sqlserver的
可能还有其他方法,但是我用这个是成功了

  • 首先,这个扩展其实是依赖freetds的
  • 第二,这个扩展找的我好幸苦,但其实很简单
    1
    sudo apt install php7.1-sybase

安装完这个,会有freetds和pdo_dblib

就是这么简答

后续问题:sqlserver获取中文数据乱码

这个问题也头疼了一个下午,因为在我的mac上是好的,但是在服务器上是不行的
解决起来也容易,问题出在freetds的配置上
编辑freetds配置文件

1
sudo vim /etc/freetds/freetds.conf

在[global]下,修改一行

1
tds version = 8.0

增加一行

1
client charset = UTF8

注意:必须设置7.0 以上,才支持client charset = UTF8这个参数

重新运行脚本,就正常了

坑备注

  1. 之前一直以为使用pdo_odbc这个扩展,其实没用
  2. laravel其实使用new PDO(‘sqlsrv:Server=xxxxx…)这个链接的,可以写个简单的php脚本先调试
  3. freetds不用启动,很多网站说要启动这个服务,还要修改配置啥,我这边直接就可以使用