<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Hunk &#187; sql server</title>
	<atom:link href="http://blog.hunk.com.mx/category/sql-server/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.hunk.com.mx</link>
	<description>Welcome to Fight Club</description>
	<lastBuildDate>Mon, 14 Jun 2010 00:24:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Búsquedas LIKE con acentos en SQL Server</title>
		<link>http://blog.hunk.com.mx/busquedas-like-con-acentos-en-sql-server/</link>
		<comments>http://blog.hunk.com.mx/busquedas-like-con-acentos-en-sql-server/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 06:13:45 +0000</pubDate>
		<dc:creator>hunk</dc:creator>
				<category><![CDATA[sql server]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.hunk.com.mx/?p=337</guid>
		<description><![CDATA[Hay ocasiones en las que tenemos que hacer búsquedas de palabras o que concuerden con el patrón en la base de datos, lo más común es usar LIKE. Por lo general esto basta, pero hay ocasiones donde en la BD se tiene acentos y no podemos decir aahhh saben que, pues deben poner los acentos [...]]]></description>
			<content:encoded><![CDATA[<p>Hay ocasiones en las que tenemos que hacer búsquedas de palabras o que concuerden con el patrón en la base de datos, lo más común es usar LIKE. Por lo general esto basta, pero hay ocasiones donde en la BD se tiene acentos y no podemos decir aahhh saben que, pues deben poner los acentos bien, para estos casos la DB nos permite hacer estas búsquedas con acentos si el COLLATION es correcto, pero hay ocasiones donde no podemos cambiarlo o no es correcto para hacer búsquedas con acentos en las palabras, para eso podemos hacer el pequeño truco que explicare continuación (Esto en SQL Server), pero veamos mi ejemplo y la solución para búsqueda con acentos.</p>
<p>En mi app tengo un campo que es autocomplete, esto es el usuario va escribiendo  la palabra y conforme escribe la palabra le mostraba los posibles resultados de sus búsqueda, podemos hacerlo fácilmente con el siguiente plugin de JQuery (<a href="http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/">Autocomplete</a>) todo bien hasta este momento.</p>
<p>La query que el sistema hace es algo como esto:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span>nombre <span style="color: #993333; font-weight: bold;">FROM</span> usuarios <span style="color: #993333; font-weight: bold;">WHERE</span> nombre <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">'%mi_palabra%'</span>;</div></div>
<p>Parece que todo esta funcionando correctamente, me regresa los usuarios que concuerdan con la palabra, por ejemplo si la palabra es “ponce” me regresa los nombres que contienen “ponce”, pero si la búsqueda es “gomez” regresa todos los que en la DB están como “gomez”, pero no los que están como “gómez”, y al escribir “gómez” regresa todos los que están como “gómez” y no los que están como “gomez”, por tanto no esta funcionado correctamente, después de una rápida búsqueda en Google de cómo hacer búsquedas con LIKE de palabras con acento en todas de las paginas encontré que se debe modificar el collation de la tabla o la DB, de la siguiente forma:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> <span style="color: #66cc66;">&#91;</span>nombrebasededatos<span style="color: #66cc66;">&#93;</span> COLLATE Modern_Spanish_CI_AI</div></div>
<p>Pero en mi caso yo no puedo modificar el collation de la tabla o de la DB, yo no puedo modificar el collation de la tabla por que yo uso una vista de otra tabla y aquí es donde entra el problema, como hacer búsquedas con acentos si no podemos cambiar el collation de la tabla o de la BD por alguna circunstancia?</p>
<p>Durante estos años que he estado en el desarrollo de app siempre he podido darle la vuelta a este tipo de problemas, se que siempre hay una solución aun que no se tan elegante ni la mejor, siempre hay una solución.</p>
<p>Bueno sabemos que en las búsquedas de LIKE existen wildcarts (%,_) siempre había usado eso wildcarts en MySQL, busque la sentencia LIKE en la referencia de <a href="http://msdn.microsoft.com/en-us/library/ms179859.aspx">MSDN</a> dado que en esta ocasión estoy usando SQL Server y encontré el wildcart [ ], este wildcart  contiene la siguiente descripció:</p>
<blockquote><p>“Cualquier carácter individual del intervalo ([a-f]) o del conjunto ([abcdef]) que se ha especificado.”</p></blockquote>
<p>Con el siguiente párrafo como ejemplo</p>
<blockquote><p>“WHERE au_lname LIKE ‘[C-P]arsen’ busca apellidos de autores que terminen en arsen y empiecen por cualquier carácter individual entre C y P, como Carsen, Larsen, Karsen, etc. En las búsquedas de intervalos, los caracteres incluidos en el intervalo pueden variar, dependiendo de las reglas de ordenación de la intercalación.”</p></blockquote>
<p>Por lo tanto podemos hacer un query como lo siguiente:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span>nombre <span style="color: #993333; font-weight: bold;">FROM</span> usuarios <span style="color: #993333; font-weight: bold;">WHERE</span> nombre <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">'%g[oó]mez%'</span>;</div></div>
<p>Y con eso obtendríamos todos los gomez y gómez. Podemos decir que gran parte del problema ya lo tenemos resuelto, solo nos resta identificar todas aquellas letras que pueden ser acentuadas, como por ejemplo cuando identifiquemos “o”,”ò”,”ó” o “ö” hacemos el remplazo por [oóòö] o las letras “u”,”ù”,”ú” o “ü” remplazariamos por [uúùü] dependiendo el lenguaje de programación que uses será la forma de remplazo ahí entra nuestro amigo expresiones regulares,  en mi caso use preg_replace y quedo solucionado el problema, la query final que hace el sistema para gomez es:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> id<span style="color: #66cc66;">,</span>nombre <span style="color: #993333; font-weight: bold;">FROM</span> usuarios <span style="color: #993333; font-weight: bold;">WHERE</span> nombre <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">'%g[oóòö]m[eèéë]z%'</span>;</div></div>
<p>Bueno espero que esto le sirva a alguien más.</p>
<p><strong>Byte</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.hunk.com.mx/busquedas-like-con-acentos-en-sql-server/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
