2010-11-10 37 views
5

Estoy utilizando Sql Server 2008 R2 Enterprise. Estoy codificando una aplicación capaz de insertar, actualizar, eliminar y seleccionar registros de tablas Sql. La aplicación comete errores cuando se trata de registros que contienen caracteres especiales, como ć, č š, đ y ž.Caracteres Unicode en la tabla SQL

Esto es lo que sucede:

El comando:

INSERT INTO Account (Name, Person) 
VALUES ('Boris Borenović', 'True') 
WHERE Id = '1' 

inserta un nuevo disco, pero el campo Nombre es Boris Borenovic, por lo que el carácter ć se cambia a c.

El comando:

SELECT * FROM Account 
WHERE Name = 'Boris Borenović' 

devuelve el registro correcto, por lo que una vez más el carácter ć se sustituye por c y se devuelve el expediente.

Preguntas:

  1. ¿Es posible hacer que SQL Server Save los caracteres especiales y otros ć se mencionó anteriormente?
  2. ¿Todavía es posible, si se resuelve la pregunta anterior, hacer que Sql pueda devolver el registro Boris Borenović aunque la consulta solicite Boris Borenovic?

Por lo tanto, al guardar los registros que desea que SQL para guardar exactamente lo que se da, pero cuando se recuperan los registros, que quieren que sea capaz de ingnore los caracteres especiales . Gracias por toda la ayuda.

Respuesta

12

1) Asegúrese de que la columna es de tipo nvarchar en lugar de varchar (o Nchar char)

2) Utilice N' en el inicio de los literales de cadena que contienen tales secuencias, por ejemplo, N'Boris Borenović'

3) Si está utilizando una biblioteca de cliente (por ejemplo ADO.Net), se debe manejar texto Unicode, siempre y cuando, de nuevo, los parámetros se marcan como nvarchar/nchar en lugar de varchar/char

4) Si desea consultar e ignorar los acentos, puede agregar una cláusula COLLATE a su selección. Ej .:

SELECT * FROM Account 
WHERE Name = 'Boris Borenovic' COLLATE Latin1_General_CI_AI 

Dónde _CI_AI significa mayúsculas y minúsculas, Accent Insensible, debe devolver todas las filas con todas las variantes de la "C" al final.

5) Si la columna de la tabla es parte de una restricción UNIQUE/PK, y necesita que contenga tanto "Boris Borenović" como "Boris Borenovic", agregue una cláusula COLLATE a la definición de columna, pero esto use una intercalación con "_AS" al final, que dice que es sensible al acento.

+0

Gracias por su respuesta. El campo Nombre en mi tabla Sql es de tipo nvarchar (50), por lo que el problema sigue siendo el mismo. En cuanto al cotejo, creo que debería resolver la segunda pregunta, sin embargo, hasta que resuelva el 'ć' y otros caracteres que faltan, estoy atascado. Revisé mi texto de comando Sql en el código y parece normal (lo que significa que contiene esos molestos personajes). ¿Podría haber algo más que impida el ahorro de esos personajes? ¿Cómo es que la declaración SELECT también convierte 'ć' a' c' (no estoy usando COLLATE)? – Boris

+0

@Boris - como digo (punto 2), si tiene literales de cadena (como en los ejemplos que ha publicado), debe poner una "N" antes de la comilla de apertura, de lo contrario la cadena se convertirá en otra forma antes de llegar a la mesa. –

+0

OK, lo tengo! ¿Debo colocar esa 'N' delante de cada valor de campo? – Boris

1

Para permitir que SQL Server almacene caracteres especiales, use nvarchar en lugar de varchar para el tipo de columna.

Cuando se recupera, puede forzar una colación acento-Insensible para que ignore los diferentes C de:

WHERE Name = 'Boris Borenović' COLLATE Cyrillic_General_CI_AI 

Aquí, CI significa mayúsculas y minúsculas, y en cuanto a acento insensible.

Cuestiones relacionadas