2009-08-24 56 views
20

Estoy tratando de almacenar algunos datos en una base de datos de SQL Server a través de php.PHP + SQL Server: cómo configurar el juego de caracteres para la conexión?

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

Convertir los datos manualmente antes de insertar no ayuda, parece que hay alguna conversión pasando.

La ejecución de la consulta SQL 'set char_convert off' tampoco ayuda.

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

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

+0

mssql.charset solo está disponible con FreeTDS. ¿Este parámetro de configuración aparece en phpinfo() en su servidor? – VolkerK

+0

Sí, aparece. Phpinfo también afirma que la versión de la biblioteca MSSQL es FreeTDS. valor local: windows-1252 valor maestro: sin valor – Maurice

Respuesta

19

juego de caracteres del cliente es necesaria pero no suficiente:

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

He buscado 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 puede, primero necesita convertir a UCS2 (como recomienda la solución de cypher). En Windows SQLSRV dice que es una buena solución, que no pude probar, ya que estoy desarrollando en Mac OSX.

Sin embargo, manual de FreeTDS (lo utiliza mssql PHP en OSX) dice a añadir una letra "N" antes de la cita de apertura:

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

De acuerdo con esta discusión, N personaje le dice al servidor para convertir a Unicode . https://softwareengineering.stackexchange.com/questions/155859/why-do-we-need-to-put-n-before-strings-in-microsoft-sql-server

+0

Ahorre mi día muchas gracias. –

0

no puedes convertir sus tablas para la codificación de la aplicación? ¿O usar utf-8 en ambos?

No sé si MSSQL es compatible con las codificaciones a nivel de tabla.

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

+0

Lamentablemente, no puedo. Porque no es mi base de datos, y tampoco es mi marco de trabajo. La conversión de caracteres especiales a entidades tampoco es una opción, ya que también hay algún software no web conectado a este db. Estoy acostumbrado a convertir con iconv, pero voy a probar MB. – Maurice

+0

Mismos resultados con mb. Parece que se realiza alguna conversión automática al enviar datos a db. – Maurice

2

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

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

tuve que configurar manualmente la codificación de origen, porque fue reportado erróneamente como 'ISO-8859-1' por mb_detect_encoding().

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!

4

Sugiero mirar a los siguientes puntos:

  1. Asegúrese de que las columnas que se está almacenando la información en nchar son o nvarchar como char y nvarchar no son compatibles con UCS-2 (SQL Server no almacena en formato UTF-8 por cierto)
  2. Si va a conectar con el mssql library/extension para PHP, ejecute: ini_set('mssql.charset', 'utf-8'); ya que no hay función con un argumento charset (conectar, consulta etc)
  3. asegurarse de que sus navegadores juego de caracteres está también fijado a UTF-8
+0

Además, si está utilizando Zend_Db, no olvide el parámetro de juego de caracteres al inicializar la conexión: ... params.charset = "utf8" –

5

que tenía el mismo problema y ini_set('mssql.charset', 'utf-8') no funcionó para mí. Sin embargo, se trabajó en mayúsculas:

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

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

No es posible evitar la conversión de juegos de caracteres cuando se usa el protocolo TDS versión 7 o superior (más o menos equivalente a MSSQL 2005 o posterior).

+3

En un sistema Linux, puede establecer esta versión del protocolo TDS en 'freetds.conf' especificando las siguientes opciones bajo el parámetro agrupación' [global] '- ' tds version = 8.0' 'client charset = UTF-8' Ver: https://gist.github.com/johnkary/6643856 –

2

Para mí la edición de este archivo:
/etc/freetds/freetds.conf
... y cambiando 'TDS versión' parámetro/ajuste 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 el reinicio de apache.

1

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

1. Establecer /your/local/freetds.conf archivo:

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

2. Asegúrese de que su DSN de conexión utiliza el nombre del servidor, no el IP:

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

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

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

se debe configurar el juego de caracteres con ini_set ('mssql.charset', 'windows-1252') antes de la conexión. Si lo usa después de mssql_connect, no tiene ningún efecto.

0

Simplemente agregando ini_set('mssql.charset', 'UTF-8'); no me ayudó en mi caso. Tuve que especificar el juego 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'))); 
Cuestiones relacionadas