我在Ubuntu 16.04上安装了php7.0-sybase(版本7.0.18-0ubuntu0.16.04.1)。 FreeTDS的版本是0.91(Ubuntu上最新的版本)
这是我的/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());
我希望将字段的内容视为guid,而不是我获取二进制内容
例如,我希望看到[my_field] => 8CAFC97B-30C2-4096-9367-9D240085A16E
,而是获得[my_field] => {ɯ▒▒0▒@▒g▒$▒▒n
答案 0 :(得分:1)
可能您的数据库将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类中。所以每当我需要它们时,我只需要给助手打电话。如果它对你更好,你也可以在整个应用程序中使用它。