utf8_encode utf8 type sqlsrv_connect español content charset php sql-server database character-encoding

utf8 - PHP+SQL Server-¿Cómo configurar charset para la conexión?



sqlsrv_connect character set (11)

¿No puedes simplemente convertir tus tablas a la codificación de tu aplicación? ¿O usar utf-8 en ambos?

Sin embargo, no sé si MSSQL admite codificaciones a nivel de tabla.

Además, pruebe las funciones de cadena MB (multibyte), si falla lo anterior.

Estoy tratando de almacenar algunos datos en una base de datos de SQL Server a través de php.

El problema es que los caracteres especiales no se convierten correctamente. El conjunto de caracteres de mi aplicación es iso-8859-1 y el que usa el servidor es windows-1252.

Convertir los datos manualmente antes de insertarlos no ayuda, parece que se está produciendo una conversión.

Ejecutar la consulta SQL ''establecer char_convert off'' tampoco ayuda.

¿Alguien tiene alguna idea de cómo puedo hacer que esto funcione?

EDITAR: He intentado ini_set (''mssql.charset'', ''windows-1252''); también, pero tampoco hay resultado con eso.


Debe establecer el conjunto de caracteres con ini_set (''mssql.charset'', ''windows-1252'') antes de la conexión. Si lo usa después de mssql_connect, no tiene efecto.


El juego de caracteres del cliente es necesario pero no suficiente:

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

Busqué durante dos días cómo insertar datos UTF-8 (de formularios web) en MSSQL 2008 a través de PHP. Leí en todas partes que no puedes, primero debes convertirte a UCS2 (como recomienda la solución de Cypher). En Windows, SQLSRV dijo que era una buena solución, que no pude probar, ya que estoy desarrollando en Mac OSX.

Sin embargo, el manual de FreeTDS (lo que PHP mssql usa en OSX) dice agregar una letra "N" antes de la cita inicial:

mssql_query("INSERT INTO table (nvarcharField) VALUES (N''űáúőűá球最大的采购批发平台'')", +xon);

De acuerdo con esta discusión, el carácter N le dice al servidor que se convierta a Unicode. https://softwareengineering.stackexchange.com/questions/155859/why-do-we-need-to-put-n-before-strings-in-microsoft-sql-server


He tenido suerte en una situación similar (usando una conexión PDO ODBD) usando el siguiente código para convertir la codificación antes de imprimir la salida:

$data = mb_convert_encoding($data, ''ISO-8859-1'', ''windows-1252'');

Tuve que configurar manualmente la codificación de origen, porque mb_detect_encoding() estaba informando erróneamente como ''ISO-8859-1''.

Mis datos también estaban siendo almacenados en la base de datos por otra aplicación, por lo que podría estar en una situación única, ¡aunque espero que ayude!


Para mi editar este archivo:
/etc/freetds/freetds.conf
... y cambiar / configurar el parámetro ''versión tds'' a ''7.0'' ayudó. Edite su freetds.conf e intente cambiar este parámetro para la configuración de su servidor (o global).

Funcionará incluso sin reinicio de apache.



Si es ini_set(''mssql.charset'', ''UTF-8''); no ayuda Y no tiene acceso de root para modificar el archivo freetds.conf todo el sistema, esto es lo que puede hacer:

1. Configure el archivo /your/local/freetds.conf :

[sqlservername] host=192.168.0.56 port=1433 tds version=7.0 client charset=UTF-8

2. Asegúrese de que su conexión DSN esté usando el nombre de servidor, no la IP:

''dsn'' => ''dblib:host=sqlservername;dbname=yourdb

3. Haga FreeTDS para usar su archivo freetds.conf local como un usuario sin privilegios del script php a través de las variables env:

putenv(''FREETDSCONF=/your/local/freetds.conf'');


Si está utilizando la versión 7 o superior del protocolo TDS, TODAS las comunicaciones a través del cable se convierten a UCS2. El servidor convertirá de UCS2 a cualquier tabla o columna que esté configurada, a menos que la columna sea nvarchar o ntext. Puede almacenar UTF-8 en varchar o texto regular, solo tiene que usar una versión de protocolo TDS inferior a 7, como 6.0 o 4.2. El único inconveniente de este método es que no puede consultar ninguna tabla nvarchar, ntext o sys. * (Creo que tampoco puede realizar ninguna CAST ()), ya que el servidor se niega a enviar cualquier cosa que pueda convertirse en UTF-8 a cualquier cliente que utilice una versión de protocolo inferior a 7.

No es posible evitar la conversión de juegos de caracteres cuando se utiliza la versión 7 o superior del protocolo TDS (aproximadamente equivalente a MSSQL 2005 o más reciente).


Simplemente agregando ini_set(''mssql.charset'', ''UTF-8''); No me ayudó en mi caso. Tuve que especificar el conjunto de caracteres UTF-8 en la columna:

$age = 30; $name = utf8_encode("Joe"); $select = sqlsrv_query($conn, "SELECT * FROM Users WHERE Age = ? AND Name = ?", array(array($age), array($name, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(''UTF-8'')));


Sugiero mirar los siguientes puntos:

  1. Asegúrese de que las columnas en las que está almacenando la información sean nchar o nvarchar, ya que char y nvarchar no admiten UCS-2 (SQLServer no almacena en formato UTF-8 por cierto)
  2. Si se está conectando con la biblioteca / extensión mssql para PHP, ejecute: ini_set(''mssql.charset'', ''utf-8''); ya que no hay función con un argumento charset ( conectar, consultar, etc.)
  3. Asegúrese de que el conjunto de caracteres de su navegador también esté configurado en UTF-8

Tuve el mismo problema e ini_set(''mssql.charset'', ''utf-8'') no funcionó para mí. Sin embargo, funcionó en mayúsculas:

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