首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用PHP FreeTDS扩展从MSSQL服务器获取使用UTF-8字符集的数据

使用PHP FreeTDS扩展从MSSQL服务器获取使用UTF-8字符集的数据
EN

Stack Overflow用户
提问于 2012-11-14 19:19:25
回答 8查看 80.9K关注 0票数 19

我似乎无法从使用FreeTDS扩展的UTF-8编码的MSSQL中获取数据。

正在连接:

代码语言:javascript
复制
ini_set('mssql.charset', 'UTF-8');
$this->_resource = mssql_connect($config['servername'], $config['username'], $config['password']);

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

我尝试创建~/.freetds.conf

代码语言:javascript
复制
[global]
client charset = UTF-8

我尝试过将参数传递给php:

代码语言:javascript
复制
php -d mssql.charset="UTF-8" index.php

数据仍然不是UTF-8格式。

php -i

代码语言:javascript
复制
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

想法?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2012-11-14 19:27:37

MSSQL和UTF-8在...有时候。我不得不手动转换它。问题: MSSQL实际上并不知道和支持UTF-8。

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

代码语言:javascript
复制
mb_detect_encoding($value, mb_detect_order(), true) === 'UTF-8' ? $value : mb_convert_encoding($value, 'UTF-8');

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

代码语言:javascript
复制
mb_convert_encoding($value, 'UCS-2LE', mb_detect_encoding($value, mb_detect_order(), true));

幸运的是,我使用的是Doctrine,所以我所拥有的就是创建一个自定义的StringType实现。

票数 16
EN

Stack Overflow用户

发布于 2012-12-14 19:25:35

我也有类似的问题,我尝试了所有我能在网上找到的设置--都是徒劳的。

在我的例子中,问题出在FreeTDS本身的配置上。在Linux上,该文件为/etc/freetds/freetds.conf

我不得不将版本改为7.0 (也许其他数字也可以。我刚试过7.0)

代码语言:javascript
复制
[global]
    # TDS protocol version
    tds version = 7.0

在此之后,驱动程序似乎接受字符集的更改,如。

代码语言:javascript
复制
ini_set('mssql.charset', 'UTF-8');

顺便说一句:更改立即生效,之后不需要重新启动任何内容

票数 30
EN

Stack Overflow用户

发布于 2015-02-26 19:58:40

如果您使用freeTDS,则应在/etc/freetds/freetds.conf上更改以下行

代码语言:javascript
复制
[global]
# TDS protocol version
tds version = 4.2

要这样做:

代码语言:javascript
复制
[global]
# TDS protocol version
tds version = 8.0
;tds version = 4.2

最后添加下面这一行:

代码语言:javascript
复制
# set charset
client charset = UTF-8

**客户端字符集在全局范围内

在查询中,您应该使用N个字符。如下所示:

代码语言:javascript
复制
$query = "INSERT INTO dbo.SMSOutbox (StationID, Dest, Text) VALUES ";
   $query .= '(';
   $query .= "'" . $this->stationId . "', ";
   $query .= "'" . $this->destination . "', ";
   $query .= "N'" . $this->text . "'";
   $query .= ')';
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13377812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档