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?
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.
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
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 .= ')';
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.
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');
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;
}
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.