Pregunta

La pregunta es acerca de Armenia. Estoy usando SQL Server 2005, el cotejo SQL_Latin1_General_CP1_CI_AS, principalmente datos es en armenio y no podemos utilizar Unicode.

He probado en MS SQL 2008 con una intercalación de Windows para el idioma armenio (Cyrillic_General_100_), he encontrado aquí, ( http://msdn.microsoft.com/en-us/library/ms188046.aspx ), pero no sirvió de nada.

Tengo una función, que los valores de las órdenes hexagonales y una función inferior, que toma cada caracter en cada cadena y la convierte en su forma más baja, pero no es una solución aceptable, que funciona muy lento, llamando a que las funciones de cada columna de una enorme mesa.

¿Hay alguna solución para este problema no usar Unicode y no se trabaja con valores hexadecimal de forma manual?

ACTUALIZACIÓN:

En el lado izquierdo son palabras de casos mixtos, ordenados en el orden correcto y con las representaciones minúsculas en el lado derecho. Espero que esta ayuda voluntad. Gracias. Las palabras se escriben en Unicode.

  1. ԱբԳդԵզ -> աբգդեզ

  2. ԱգԳսԴԼ -> ագգսդլ

  3. ԲաԴֆդԴ -> բադֆդդ

  4. ԳԳԼասա -> գգլասա

  5. ԴմմլօՏ -> դմմլօտ

  6. ԵլԲնՆն -> ելբննն

  7. ԶՎլուտ -> զվլուտ

  8. էԹփձջՐ -> էթփձջր

  9. ԸխԾդսՂ -> ըխծդսղ

  10. ԹԶէըԿր -> թզէըկր

¿Fue útil?

Solución

Una solución sería la creación de una columna calculada para cada columna de texto que convierte el valor en la intercalación armenio y ajustarlo en el caso de baja de este modo:

Alter Table TableName
    Add TextValueArmenian As ( LOWER(TextColumn COLLATE Latin1_General_CI_AS) ) PERSISTED

Una vez hecho esto, se puede poner índices en estas columnas y consulta para ellos.

Si eso no es su sabor del té, a continuación, otra solución sería una vista indizada donde se crea una vista con SCHEMABINDING que pone en cada una de las diferentes columnas a minúsculas y para la colación derecha y luego poner en índices ese punto de vista .

Editar I aviso en su ejemplos, que su está utilizando una caja de insensibles, Accent y minúsculas. Tal vez la solución sencilla para sus problemas de pedido sería utilizar Latin1_General_CS_AS o Cyrillic_General_100_CS_AS si está disponible.

Editar

Uf. Después de un poco de investigación, creo que tengo una respuesta que, desgraciadamente, no puede ser que le conviene. En primer lugar, sí que se puede copiar el texto que ya ha proporcionado en código o algo como Notepad ++ porque Stackoverflow está codificado con UTF-8 y armenio encajará en UTF-8. En segundo lugar, esta alusión a lo que está tratando de lograr: el almacenamiento de UTF-8 en SQL Server. Por desgracia, SQL Server 2008 (o cualquier versión anterior) no es compatible de forma nativa UTF-8. Con el fin de almacenar datos en UTF-8, que tiene un puñado de opciones:

  1. tienda en binario y convertirlo en UTF-8 en el cliente (que prácticamente elimina cualquier sorting realiza en el servidor)
  2. Tienda en Unicode y convertirlo en UTF-8 en el cliente. Cabe señalar que el controlador de SQL Server ya estará convertir la mayoría de las cadenas a Unicode y su ejemplo no funcionan bien en Unicode. La desventaja obvia es que se come el doble de espacio.
  3. Crear un tipo definido por el usuario CLR en SQL Server para almacenar UTF-8 valores. Microsoft proporciona una muestra que viene con SQL Server para hacer precisamente esto. Puede descargar las muestras de CodePlex de aquí . También puede encontrar más información sobre el ejemplo de este artículo en el Libros en . La desventaja es que usted tiene que tener habilitado el CLR en SQL Server y no estoy seguro de lo bien que va a realizar.

Ahora, dicho esto, yo era capaz de obtener la muestra de trabajo sin ningún problema usando Unicode en SQL Server.

If object_id('tempdb..#Test') Is Not Null
    Drop Table #Test
GO
Create Table #Test
(
    EntrySort int identity(1,1) not null
    , ProperSort int 
    , MixedCase nvarchar(50)
    , Lowercase nvarchar(50)
)
GO
Insert #Test(ProperSort, MixedCase, Lowercase)
Select 1, N'ԱբԳդԵզ',N'աբգդեզ'
Union All Select 6, N'ԵլԲնՆն',N'ելբննն'
Union All Select 2, N'ԱգԳսԴԼ',N'ագգսդլ'
Union All Select 3, N'ԲաԴֆդԴ',N'բադֆդդ'
Union All Select 4, N'ԳԳԼասա',N'գգլասա'
Union All Select 5, N'ԴմմլօՏ',N'դմմլօտ'
Union All Select 9, N'ԸխԾդսՂ',N'ըխծդսղ'
Union All Select 7, N'ԶՎլուտ',N'զվլուտ'
Union All Select 10, N'ԹԶէըԿր',N'թզէըկր'
Union All Select 8,N'էԹփձջՐ',N'էթփձջր'

Select * From #Test Order by ProperSort
Select * From #Test Order by Lowercase
Select * From #Test Order by Lower(MixedCase)

Los tres de estas consultas devuelven el mismo resultado.

Otros consejos

¿Recibió un error como este?

Msg 448, Level 16, State 1, Line 1
Invalid collation 'Cyrillic_General_100_'.

Trate:

ORDER BY Name COLLATE Cyrillic_General_100_CI_AS

O elija uno que prefiera de la lista:

select * from fn_helpcollations()
where name like 'Cyrillic_General_100_%'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top