INF: Cómo obtener resultados de consultas que distingan mayúsculas de minúsculas con un orden que no distingue mayúsculas de minúsculas

Seleccione idioma Seleccione idioma
Id. de artículo: 171299 - Ver los productos a los que se aplica este artículo
Este artículo se publicó anteriormente con el número E171299
Expandir todo | Contraer todo

Resumen

Un orden es un conjunto de normas que determina de qué manera SQL Server intercala y muestra datos en respuesta a consultas a bases de datos. El orden determina la disposición en que se presentan los datos en respuesta a instrucciones de SQL Server que implican cláusulas GROUP BY, ORDER BY y DISTINCT. El orden también determina cómo se resuelven determinadas consultas como las que implican cláusulas WHERE y DISTINCT.

Durante la instalación, SQL Server le permite seleccionar el conjunto de caracteres y el orden que el servidor utilizará. Hay varios órdenes y conjuntos de caracteres disponibles. De manera predeterminada, el conjunto de caracteres es ANSI (ISO 8859-1) y el orden es el orden de diccionario, sin distinguir mayúsculas de minúsculas.

Si se selecciona un orden que no distingue mayúsculas de minúsculas, SQL Server tiene en cuenta los valores de caracteres que son iguales y que sólo difieren en las mayúsculas o minúsculas. Por ejemplo, 'Juan' = 'juan'. En el caso de un orden que distingue mayúsculas de minúsculas, suele ser necesario obtener resultados de la consulta en los que se realice esta distinción. En este artículo se explican las técnicas para conseguirlo.

SQL Server 2000 reemplaza páginas de códigos y órdenes por intercalaciones. SQL Server 2000 es compatible con la mayoría de las intercalaciones admitidas en versiones anteriores de SQL Server e introduce un nuevo conjunto de intercalaciones basadas en las de Windows. Ahora puede especificar intercalaciones en el nivel de base de datos o en el de columna. Anteriormente las páginas de códigos y los órdenes sólo podían especificarse en el nivel de servidor, aplicándose a todas las bases de datos almacenadas en el mismo. Para obtener más información, consulte "intercalaciones" en Libros en pantalla de SQL Server 2000.

Más información

Para examinar las ramificaciones de un orden que distingue mayúsculas de minúsculas en los resultados de una consulta, tenga en cuenta el siguiente escenario:
 
create table T1(col1 char(5) NOT NULL, col2 int NOT NULL) 
go 
insert T1 values('Juan',1) 
insert T1 values('Juan',1) 
insert T1 values('JUan',1) 
insert T1 values('JUan',1) 
insert T1 values('JuAn',1) 
insert T1 values('JuAn',1) 
insert T1 values('Juan',1) 
insert T1 values('JuaN',1) 
insert T1 values('JuaN',1) 
insert T1 values('juan',1) 
insert T1 values('juan',1) 
insert T1 values('juan',1) 
go

Si se ejecuta la siguiente consulta en un servidor con un orden que no distingue mayúsculas de minúsculas, se obtendrán los siguientes resultados:
 
select DISTINCT(col1) from T1 
go

 
col1
-----
Juan

 (1 fila afectada)

Sin embargo, si se ejecuta la misma consulta en un servidor con un orden que distingue mayúsculas de minúsculas, se obtendrán los siguientes resultados:
 
col1
----- 
Juan 
JUan 
JuAn 
JuaN 
juan

 (5 filas afectadas)

En cuanto al uso de las cláusulas GROUP BY, ORDER BY y WHERE, observe los resultados de estas consultas ejecutadas en un servidor con un orden que no distingue mayúsculas de minúsculas y compárelas con las consultas modificadas que se muestran a continuación. Observe que, en todos los casos, todos los valores de col1 se consideran como un único valor:
 
SELECT sum(col2)'col2 Totales del grupo' from T1 group by col1 
go
 
col2 Totales del grupo 
---------------------- 
12

 (1 fila afectada)

 
SELECT * from T1 order by col1 
go
 
col1 col2 
----- ----------- 
Juan 1 
Juan 1 
JUan 1 
JUan 1 
JuAn 1 
JuAn 1 
Juan 1 
JuaN 1 
JuaN 1 
juan 1 
juan 1 
juan 1 

 (12 filas afectadas)

 
SELECT * from T1 where col1='juan' 
go
 
col1 col2 
----- ----------- 
Juan 1 
Juan 1 
JUan 1 
JUan 1 
JuAn 1 
JuAn 1 
Juan 1 
JuaN 1 
JuaN 1 
juan 1 
juan 1 
juan 1 

 (12 filas afectadas)

Para obtener resultados que distingan mayúsculas de minúsculas con la función DISTINCT y las cláusulas GROUP BY, ORDER BY y WHERE, los datos reales deben estar almacenados en forma binaria y cada carácter debe estar representado por un único valor hexadecimal. Utilice la función CONVERT para convertir el formato de caracteres de los datos a una cadena de valores hexadecimales. La función DISTINCT y las cláusulas GROUP BY, ORDER BY y WHERE pueden actuar sobre los resultados de la conversión independientemente de la distinción entre mayúsculas y minúsculas.

Considere los resultados de la siguiente consulta, donde se muestran los datos de caracteres originales y su correspondiente representación hexadecimal:
 
select col1,'=',CONVERT(binary(5),col1)'valores hexadecimales' from T1
 
col1 valores hexadecimales 
----- - ------------------ 
Juan = 0x4a6f686e20 
Juan = 0x4a6f686e20 
JUan = 0x4a4f686e20 
Juan = 0x4a4f686e20 
JuAn = 0x4a6f486e20 
JuAn = 0x4a6f486e20 
Juan = 0x4a6f686e20 
JuaN = 0x4a6f684e20 
JuaN = 0x4a6f684e20 
juan = 0x6a6f686e20 
juan = 0x6a6f686e20 
juan = 0x6a6f686e20 

 (12 filas afectadas)

Observe que, en los resultados, cada valor único de col1 tiene una representación hexadecimal diferente. Para obtener los valores distintivos en formato de caracteres, ejecute el siguiente conjunto de instrucciones. Se obtendrán los mismos resultados que con una consulta en la que se utilice la función DISTINCT en un servidor que distinga mayúsculas de minúsculas.
 
select DISTINCT(CONVERT(binary(5),col1))'col1' 
into #t1 
from T1 
go 
select CONVERT(char(5),col1)'resultados de caracteres distintivos' from #t1 
go 

 (5 filas afectadas)
 ----- 
JUan 
JuAn 
JuaN 
Juan 
juan

 (5 filas afectadas)

Para realizar consultas con las cláusulas GROUP BY u ORDER BY, considere los siguientes ejemplos:
 
select DISTINCT(CONVERT(binary(5),col1))'col1',sum(col2)'col2' 
into #t1 
from T1 
group by CONVERT(binary(5),col1) 
go 
select CONVERT(char(5),col1)'resultados de caracteres distintivos',col2'Totales 
del grupo' 
from #t1 
go
 
(5 filas afectadas)

 resultados de caracteres distintivos, Totales del grupo
 ------------------------------------- ------------ 
JUan                                   2 
JuAn                                   2 
JuaN                                   2 
Juan                                   3 
juan                                   3

 (5 filas afectadas)

 
SELECT *
from T1 
order by CONVERT(binary(5),col1) 
go
 col1 col2 
 ----- ----------- 
JUan 1 
JUan 1 
JuAn 1 
JuAn 1 
JuaN 1 
JuaN 1 
Juan 1 
Juan 1 
Juan 1 
juan 1 
juan 1 
juan 1 

 (12 filas afectadas)

Para realizar una consulta con la cláusula WHERE, utilice la función CONVERT para convertir la constante o los valores de columna en cadenas hexadecimales comparables como ocurre en el siguiente ejemplo:
 
SELECT *
from T1 
where CONVERT(binary(5),col1)=CONVERT(binary(5),'juan ') 
go
 
col1 col2 
----- ----------- 
juan 1 
juan 1 
juan 1

 (3 filas afectadas)

Es importante comprender que la elección del orden puede afectar drásticamente a los resultados obtenidos de la consultas. Cuando planee la instalación y la configuración de SQL Server, tenga en cuenta la importancia de la distinción entre mayúsculas y minúsculas. Para obtener más información sobre este tema, consulte "Conjuntos de caracteres y órdenes" en los Libros en pantalla de SQL Server y el Libro guía del Administrador.

Propiedades

Id. de artículo: 171299 - Última revisión: martes, 13 de enero de 2004 - Versión: 3.1
La información de este artículo se refiere a:
  • Microsoft SQL Server 6.0 Standard Edition
  • Microsoft SQL Server 6.5 Standard Edition
  • Microsoft SQL Server 7.0 Standard Edition
  • Service Pack 3a de Microsoft SQL Server 2000
  • Microsoft SQL Server 2000 Standard Edition
Palabras clave: 
kbhowto kbinfo kbusage KB171299

Enviar comentarios

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com