PHP linux下用freetds查询mssql数据库,uniqueidentifier类型字段问题

PHP要操作sql server数据库,需要用到freetds,具体的安装参考:http://blog.csdn.net/21aspnet/article/details/47451253

实际用了pdo_dblib扩展

命令行连接测试:

141249_8TbN_2855510.png

注意字符集,否则会出现乱码

141425_Uwbq_2855510.png

如果没有中文语言呢

  可以通过网上下载安装中文语言包yum groupinstall chinese-support

修改系统默认语言

Vi  /etc/sysconfig/i18n (注意改好之后重启一下系统)

142003_g75n_2855510.png

修改完中文乱码问题,接着要处理sql server的uniqueidentifier类型字段问题:

php查询到此字段时,得到的结果是二进制格式:

142231_MXvU_2855510.png

这时网上介绍可以是用bin2hex,或join('-', unpack('H8a/H4b/H4d/H4e/H*f', $id));但得到的结果与原始内容相比,某些端顺序不对

原始记录:EA98DE18-0479-4996-A36A-2442565EEF10

PHP得到数据:18DE98EA-7904-9649-A36A-2442565EEF10

最后查找到资料,是PHP的一个bug,【https://github.com/php/php-src/commit/a000bff2c3cbfd1d3add3ad22d12824da16479a9

通过设置,我直接得到string类型

Laravel框架为例,修改:vendor\illuminate\database\Connectors\Connector.php文件的createPdoConnection方法

protected function createPdoConnection($dsn, $username, $password, $options)
    {
        if (class_exists(PDOConnection::class) && ! $this->isPersistentConnection($options)) {
            return new PDOConnection($dsn, $username, $password, $options);
        }
        $db = new PDO($dsn, $username, $password, $options);
        if(strpos($dsn,"dblib:") !== false){
            $db->setAttribute(PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER, true);
        }
        return $db;//new PDO($dsn, $username, $password, $options);
    }

 

转载于:https://my.oschina.net/yangsnr/blog/1527538

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Linux下使用C语言通过FreeTDS读取MSSQL中的数据,需要使用FreeTDS库,并且在连接数据库时设置字符集为UTF-8。以下是一个示例代码,可以读取MSSQL数据库中的数据,并保证无中文乱码。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sybfront.h> #include <sybdb.h> #define SQL_RESULT_LEN 1024 int main() { LOGINREC *login; DBPROCESS *dbproc; DBBOOL success; RETCODE retcode; char *server = "your_server_name"; char *user = "your_username"; char *pass = "your_password"; char *database = "your_database_name"; char sql[SQL_RESULT_LEN]; char name[SQL_RESULT_LEN]; char age[SQL_RESULT_LEN]; char address[SQL_RESULT_LEN]; char phone[SQL_RESULT_LEN]; if (dbinit() == FAIL) { printf("Error initializing FreeTDS.\n"); return 1; } login = dblogin(); DBSETLUSER(login, user); DBSETLPWD(login, pass); DBSETLAPP(login, "myapp"); DBSETLVERSION(login, "70"); DBSETLCHARSET(login, "UTF-8"); dbproc = dbopen(login, server); if (dbproc == NULL) { printf("Error connecting to the database.\n"); return 1; } success = dbuse(dbproc, database); if (success == FAIL) { printf("Error selecting database.\n"); return 1; } // 注意:这里的 SQL 语句需要根据实际情况进行修改 sprintf(sql, "SELECT name, age, address, phone FROM your_table_name"); retcode = dbcmd(dbproc, sql); if (retcode != SUCCEED) { printf("Error executing SQL statement.\n"); return 1; } retcode = dbsqlexec(dbproc); if (retcode != SUCCEED) { printf("Error executing SQL statement.\n"); return 1; } while (dbresults(dbproc) != NO_MORE_RESULTS) { while (dbnextrow(dbproc) != NO_MORE_ROWS) { dbbind(dbproc, 1, NTBSTRINGBIND, 0, name); dbbind(dbproc, 2, NTBSTRINGBIND, 0, age); dbbind(dbproc, 3, NTBSTRINGBIND, 0, address); dbbind(dbproc, 4, NTBSTRINGBIND, 0, phone); dbnullbind(dbproc, 1, &name[0]); dbnullbind(dbproc, 2, &age[0]); dbnullbind(dbproc, 3, &address[0]); dbnullbind(dbproc, 4, &phone[0]); dbdata(dbproc, 1, (BYTE *)name, strlen(name)); dbdata(dbproc, 2, (BYTE *)age, strlen(age)); dbdata(dbproc, 3, (BYTE *)address, strlen(address)); dbdata(dbproc, 4, (BYTE *)phone, strlen(phone)); printf("%s\t%s\t%s\t%s\n", name, age, address, phone); } } dbexit(); return 0; } ``` 需要注意的是,在连接数据库时需要设置字符集为UTF-8,具体方法是使用`DBSETLCHARSET`函数,例如: ```c DBSETLCHARSET(login, "UTF-8"); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值