2017-06-06 104 views
0

我在Ubuntu 16.04上安装了包php7.0-sybase(版本7.0.18-0ubuntu0.16.04.1)。 freetds的版本为0.91(目前最新的Ubuntu上)PDO :: DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER被忽略

这是我/etc/freetds/freetds.conf

[global] 
     text size = 64512 
[mssql] 
     host = 192.0.1.5 
     port = 1433 
     tds version = 8.0 

的内容,这是我的/etc/odbc.ini

[mssql] 
Description = MSSQL Server 
Driver   = freetds 
Database  = MY_DB 
ServerName  = MSSQL 
TDS_Version = 8.0 

下面的内容是PHP脚本我正在尝试

<?php 
$pdo = new PDO('dblib:host=192.0.1.5;port=1433;dbname=MY_DB;charset=UTF-8', 'my_user', 'my_pass'); 
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC); 
$pdo->setAttribute(PDO::DBLIB_ATTR_STRINGIFY_UNIQUEIDENTIFIER, true); 

$sql = 'SELECT TOP 1 my_field FROM dbo.my_table'; 
$stmt = $pdo->prepare($sql); 
$stmt->execute(); 
print_r($all = $stmt->fetchAll()); 

我e xpect看到字段的内容作为一个GUID,而不是我得到的二进制内容

例如,我希望看到[my_field] => 8CAFC97B-30C2-4096-9367-9D240085A16E,而是我得到[my_field] => {ɯ▒▒0▒@▒g▒$▒▒n

回答

0

也许您的数据库存储的GUID为二进制,用于性能目的。您需要使用PHP或SQL函数将二进制({ɯ▒▒0ο@▒g▒$▒▒n)转换为十六进制(8CAFC97B-30C2-4096-9367-9D240085A16E)。我正在开发一个在MySQL数据库上使用GUID作为二进制文件的系统。这里是一个代码我使用从十六进制转换为二进制,插入的数据库,并从二进制到十六进制获得人类可读的内容:

从二元到十六进制:

public static function getId($string) 
{ 
    return strtoupper(preg_replace('/([a-zA-Z0-9]{8})([a-zA-Z0-9]{4})([a-zA-Z0-9]{4})([a-zA-Z0-9]{4})([a-zA-Z0-9]{12})/', '$1-$2-$3-$4-$5', bin2hex($string))); 
} 

从十六进制做二进制:

public static function generateId($string) 
{ 
    return hex2bin(str_replace('-', '', $string)); 
} 

记住,您需要删除GUID的破折号才能转换为二进制。

这些函数位于我系统内的Helper类中。所以无论何时我需要他们,我都会打电话给帮手。如果它对你更好,你也可以通过应用程序全部使用它。