mssql - utf8 php mysql
Obtención de datos con el conjunto de caracteres UTF-8 del servidor MSSQL con la extensión PHP FreeTDS (7)
Parece que no puedo obtener datos de MSSQL codificados como UTF-8 con la extensión FreeTDS.
Conectando:
ini_set(''mssql.charset'', ''UTF-8'');
$this->_resource = mssql_connect($config[''servername''], $config[''username''], $config[''password'']);
No tengo capacidad para usar ninguna otra extensión.
He intentado crear ~ / .freetds.conf
[global]
client charset = UTF-8
He intentado pasar parámetros a php:
php -d mssql.charset="UTF-8" index.php
Los datos aún no están 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
Ideas?
Debe cambiar su versión de TDS según la versión de servidor SQL que esté usando. Echa un vistazo a la guía de instalación para más detalles.
MSSQL y UTF-8 son un gran dolor en el ... a veces. Tuve que convertirlo manualmente. El problema: MSSQL en realidad no sabe y no admite UTF-8.
Convertir de valor de base de datos a UTF-8:
mb_detect_encoding($value, mb_detect_order(), true) === ''UTF-8'' ? $value : mb_convert_encoding($value, ''UTF-8'');
Conversión de UTF-8 al valor de la base de datos:
mb_convert_encoding($value, ''UCS-2LE'', mb_detect_encoding($value, mb_detect_order(), true));
Afortunadamente, estaba usando Doctrine, así que todo lo que tenía era crear una implementación StringType personalizada.
Parece que se requiere la versión 7.0 o grande. iconv () también parece funcionar bien, pero es tedioso.
$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;
}
Si usa freeTDS, debe cambiar las siguientes líneas en /etc/freetds/freetds.conf
:
[global]
# TDS protocol version
tds version = 4.2
A esto:
[global]
# TDS protocol version
tds version = 8.0
;tds version = 4.2
y finalmente añadir esta linea:
# set charset
client charset = UTF-8
** El conjunto de caracteres del clinet está en global [alcance]
En tus consultas, debes usar N caracteres. Me gusta esto:
$query = "INSERT INTO dbo.SMSOutbox (StationID, Dest, Text) VALUES ";
$query .= ''('';
$query .= "''" . $this->stationId . "'', ";
$query .= "''" . $this->destination . "'', ";
$query .= "N''" . $this->text . "''";
$query .= '')'';
También puede resolver este problema agregando CharacterSet UTF-8 en $ connectionInfo antes de conectarse a la base de datos.
$serverName = "MyServer";
$connectionInfo = array( "Database"=>"AdventureWorks", "CharacterSet" => "UTF-8");
$conn = sqlsrv_connect( $serverName, $connectionInfo);
Funcionó bien, no se necesita codificación adicional.
Tuve este problema y se resolvió agregando esta línea a mi script php antes de conectarme al servidor MSSQL:
ini_set(''mssql.charset'', ''UTF-8'');
Tuve un problema similar y probé todas las configuraciones que pude encontrar en la web, en vano.
En mi caso el problema fue la configuración de FreeTDS en sí. En Linux, el archivo es /etc/freetds/freetds.conf
Tuve que cambiar la versión a 7.0 (quizás también funcionen otros números. Acabo de probar 7.0)
[global]
# TDS protocol version
tds version = 7.0
Después de esto, el conductor pareció aceptar cambios del tipo de juego de caracteres.
ini_set(''mssql.charset'', ''UTF-8'');
Por cierto: el cambio está en vigencia de inmediato, no es necesario reiniciar nada después