utf8_encode utf8 mssql ini_set charset php sql-server utf-8 freetds

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?



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