使用PHP freetds的扩展与MSSQL服务器UTF-8字符集获取数据(Getting data

2019-06-21 03:53发布

我似乎无法摆脱MSSQL编码为使用UTF-8 freetds的扩展数据。

连接:

ini_set('mssql.charset', 'UTF-8');
$this->_resource = mssql_connect($config['servername'], $config['username'], $config['password']);

我没有使用任何其他扩展能力。

我试图创建〜/ .freetds.conf

[global]
client charset = UTF-8

我试图传递参数给PHP:

php -d mssql.charset="UTF-8" index.php

数据还在不在UTF-8。

PHP -i

mssql

MSSQL Support => enabled
Active Persistent Links => 0
Active Links => 0
Library version => FreeTDS

Directive => Local Value => Master Value
mssql.allow_persistent => On => On
mssql.batchsize => 0 => 0
mssql.charset => no value => no value
mssql.compatability_mode => Off => Off
mssql.connect_timeout => 5 => 5
mssql.datetimeconvert => On => On
mssql.max_links => Unlimited => Unlimited
mssql.max_persistent => Unlimited => Unlimited

想法?

Answer 1:

MSSQL和UTF-8是在一个相当痛苦......有时。 我不得不把它手动转换。 问题:MSSQL实际上并不知道和支持UTF-8。

从数据库值UTF-8转换:

mb_detect_encoding($value, mb_detect_order(), true) === 'UTF-8' ? $value : mb_convert_encoding($value, 'UTF-8');

从UTF-8转换为数据库值:

mb_convert_encoding($value, 'UCS-2LE', mb_detect_encoding($value, mb_detect_order(), true));

幸运的是我使用Doctrine所以我不得不是创建一个自定义StringType实现。



Answer 2:

我有一个类似的问题,尝试了所有的设置,我可以在网络上找到 - 白费。

在我的情况下,问题是freetds的本身的配置。 在Linux上,文件是/etc/freetds/freetds.conf

我不得不版本更改为7.0(也许其他号码的工作了。我只是想7.0)

[global]
    # TDS protocol version
    tds version = 7.0

在此之后,司机似乎接受类似的字符集的变化。

ini_set('mssql.charset', 'UTF-8');

BTW:更改立即生效,无需重启之后什么



Answer 3:

如果你使用freetds的,你应该改变对以下线路/etc/freetds/freetds.conf

[global]
# TDS protocol version
tds version = 4.2

为此:

[global]
# TDS protocol version
tds version = 8.0
;tds version = 4.2

最后加入这一行:

# set charset
client charset = UTF-8

**客户为例字符集是在全球[范围]

在查询中,你应该使用n字符。 像这样:

$query = "INSERT INTO dbo.SMSOutbox (StationID, Dest, Text) VALUES ";
   $query .= '(';
   $query .= "'" . $this->stationId . "', ";
   $query .= "'" . $this->destination . "', ";
   $query .= "N'" . $this->text . "'";
   $query .= ')';


Answer 4:

您还可以通过连接到数据库之前添加字符集UTF-8在$ connectionInfo解决这个问题。

$serverName = "MyServer";
$connectionInfo = array( "Database"=>"AdventureWorks", "CharacterSet" => "UTF-8");
$conn = sqlsrv_connect( $serverName, $connectionInfo);

工作需要的精细NO附加编码。



Answer 5:

我有这个问题,它通过连接到MSSQL Server之前加入这行来我的PHP脚本解决:

ini_set('mssql.charset', 'UTF-8');


Answer 6:

这似乎版本7.0或伟大的需要。 的iconv()也似乎运作良好,但乏味。

$query = $this->db->query($sql);
$result = $query->fetchAll(PDO::FETCH_OBJ);
foreach ($result as $row) {
    foreach (get_object_vars($row) as $key => $value) {
    $row->$key = (mb_detect_encoding($value, mb_detect_order(), true) === 'UTF-8') 
            ? $value : iconv('iso-8859-1', 'utf-8', $value);
    }
    $results[] = $row;
}


Answer 7:

你应该根据你使用的是什么版本的SQL服务器上更改TDS版本。 检查出详细的安装指南。

http://www.freetds.org/userguide/choosingtdsprotocol.htm



文章来源: Getting data with UTF-8 charset from MSSQL server using PHP FreeTDS extension