web-dev-qa-db-fra.com

Obtenir des données avec le jeu de caractères UTF-8 à partir du serveur MSSQL à l’aide de PHP Extension FreeTDS

Je n'arrive pas à obtenir les données de MSSQL encodées en UTF-8 avec l'extension FreeTDS.

De liaison:

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

Je n'ai pas la possibilité d'utiliser une autre extension.

J'ai essayé de créer ~/.freetds.conf

[global]
client charset = UTF-8

J'ai essayé de passer des paramètres à php:

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

Les données ne sont toujours pas en 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

Des idées?

19
Marius Grigaitis

MSSQL et UTF-8 sont assez pénibles dans le ... parfois. Je devais le convertir manuellement ... Le problème: MSSQL ne connaît pas et ne supporte pas UTF-8.

Conversion de la valeur de la base de données en UTF-8:

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

Conversion de UTF-8 en valeur de base de données:

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

Heureusement, j'utilisais Doctrine, je n'avais donc qu'à créer une implémentation StringType personnalisée.

16
Louis Huppenbauer

J'ai eu un problème similaire et j'ai essayé tous les réglages que je pouvais trouver sur le Web - en vain.

Dans mon cas, le problème était la configuration de FreeTDS elle-même. Sous Linux, le fichier est /etc/freetds/freetds.conf

Je devais changer la version à 7.0 (peut-être que d'autres numéros fonctionnent aussi. J'ai juste essayé 7.0)

[global]
    # TDS protocol version
    tds version = 7.0

Après cela, le pilote semblait accepter les modifications du jeu de caractères comme. 

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

Btw: le changement est immédiatement en vigueur, pas besoin de redémarrer quoi que ce soit après 

30
mschraudolph

Si vous utilisez freeTDS, vous devez modifier les lignes ci-dessous sur /etc/freetds/freetds.conf:

[global]
# TDS protocol version
tds version = 4.2

Pour ça:

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

et enfin ajouter cette ligne:

# set charset
client charset = UTF-8

** le jeu de caractères du clinet est global [scope]

Dans vos requêtes, vous devez utiliser le caractère N. comme ça:

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

Vous pouvez également résoudre ce problème en ajoutant CharacterSet UTF-8 dans $ connectionInfo avant de vous connecter à la base de données.

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

A bien fonctionné, aucun codage supplémentaire n'est nécessaire.

13
Magnus Johansson

J'ai eu ce problème et cela a été résolu en ajoutant cette ligne à mon script php avant de me connecter au serveur MSSQL:

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

Il semble que la version 7.0 ou super est requise. iconv () semble également bien fonctionner, mais est fastidieux.

$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;
}
1
jjwdesign

Vous devez modifier la version de votre TDS en fonction de la version du serveur SQL que vous utilisez en utilisant . Consultez le guide d'installation pour plus de détails.

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

0
bstory