Duda consulta a sql desde php con caracteres especiales

publicado por: Anonymous

espero podáis ayudarme con esta duda,

Dado el siguiente codigo php que se conecta a una base de datos sql server:

$sql = "select * from tabla1 where campo1 like '%ñ%'" ;
$datos = $this->objeto->listar() ;
$numRegistros = sqlsrv_row_num($datos) ;
print_r($numRegistros) ;

El resultado en pantalla es 0. Si le quito el where el resultado son 219, es decir, todos los registros de la tabla.
Se que en la tabla hay al menos 20 resultados con ñ. Es decir, no reconoce los caracteres especiales al hacer el where. Pasa lo mismo con los acentos.

La consulta es correcta, copiada y pegada en el management studio devuelve los 20 resultados. Las funciones utf8_encode y utf8_decode no me sirve, o al menos no se como hacerlo.

Podeis ayudarme con el problema?

solución

En mi caso aplico dos técnicas para poder realizar las búsquedas con caracteres acentuados.

Por el lado de PHP
utf8_decode(‘áéíóúñ’)

http://php.net/manual/es/function.utf8-decode.php

Y por el lado de SQLServer un cotejamiento que permita hacer la búsqueda insensible a mayúsculas y minúsculas, acentos y ancho donde Latin1_General_CI_AI cumple con estas reglas.

Ej:

nombre
-------
Ramón
Ramon

SELECT nombre FROM Tabla WHERE nombre LIKE '%ó%' COLLATE Latin1_General_CI_AI

En este caso el resultado será que ambos registros cumplen con la condición al especificar que la comparación es insensible a los caracteres acentuados.

Para conocer la especificación de cada cotejamiento COLALTE puedes consultarlos en tu mismo motor:

SELECT * FROM  sys.fn_HelpCollations() 
WHERE name like ('%Latin1_General_CI_AI%')
ORDER BY name;

-----------------------
Latin1_General_CI_AI: 
Latin1-General, case-insensitive, accent-insensitive, kanatype-insensitive, width-insensitive

Breve explicación y ejemplo sobre el ancho de las cadenas de texto.

https://blog.sqlauthority.com/2012/07/14/sql-server-example-of-width-sensitive-and-width-insensitive-collation/

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *