Colonna SQL Server nomi maiuscole e minuscole

case-insensitive case-sensitive collation sqlbulkcopy sql-server

Domanda

Il DB che uso ha regole di confronto French_CI_AS (l'identificatore deve stare per insensibile al maiuscolo / minuscolo) ma è sensibile al maiuscolo / minuscolo. Sto cercando di capire perché.

La ragione per cui asserisco che gli inserimenti di massa con l'installazione di un caso "GIVEN" non riescono, ma riescono con un'altra impostazione di caso "Data".

Per esempio:

  • INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES ("value1", "value2") non riesce, ma
  • INSERT INTO SomeTable([Given],[ColName]) VALUES ("value1", "value2") funziona.

EDIT Ho appena visto questo:

http://msdn.microsoft.com/en-us/library/ms190920.aspx

questo significa che dovrebbe essere possibile modificare le regole di confronto di una colonna senza svuotare tutti i dati e ricreare la tabella correlata?

Risposta popolare

Data questa informazione critica (cioè in un commento sulla domanda e non nella domanda reale):

In effetti utilizzo il metodo di inserimento in massa di Microsoft .Net, quindi non conosco la query esatta che invia al server DB.

ha senso che i nomi delle colonne vengano trattati come maiuscole e minuscole, anche in un DB senza distinzione tra maiuscole e minuscole, poiché è così che funziona la classe SqlBulkCopy . Si prega di vedere Mapping delle colonne in SqlBulkCopy sono case sensitive .

NOTE AGGIUNTIVE

  1. Quando si chiede un errore, si prega di includere sempre il messaggio di errore effettivo e completo nella domanda. Dire semplicemente che c'è stato un errore porta a un sacco di indovinelli e inseguimenti di selvaggina che a loro volta portano a risposte fuori tema.
  2. Quando si fa una domanda, si prega di non modificare le circostanze con cui si ha a che fare. Ad esempio, la domanda afferma (enfasi aggiunta):

    gli inserimenti di massa con l'installazione di un caso "GIVEN" non riescono, ma riescono con un'altra impostazione di caso "Data".

    Tuttavia, le istruzioni di esempio sono singole INSERT . Inoltre, un commento sulla domanda afferma:

    In effetti utilizzo il metodo di inserimento in massa di Microsoft .Net, quindi non conosco la query esatta che invia al server DB.

    L'uso di .NET e SqlBulkCopy è molto diverso dall'usare BULK INSERT o INSERT , rendendo la domanda corrente fuorviante, rendendo difficile (o addirittura impossibile) rispondere correttamente. Questo nuovo bit di informazioni porta anche a più domande perché quando si utilizza SqlBulkCopy , non si scrivono istruzioni INSERT : basta scrivere un'istruzione SELECT e specificare il nome della tabella di destinazione. Se si specificano i nomi di colonna per la tabella di destinazione, è nei mapping di colonne facoltativi. È questo il problema?

  3. Per quanto riguarda la sezione "MODIFICA" della domanda:

    No, la modifica delle regole di confronto della colonna non aiuta affatto, anche se non si stesse utilizzando SqlBulkCopy . Il confronto di una colonna determina come si comportano i dati memorizzati nella colonna , non come si comportano i nomi delle colonne (ovvero i meta-dati della tabella). È il Collation del database stesso che determina come si comportano i meta-dati degli oggetti a livello di database. E in questo caso, si asserisce che il DB stia usando una Collation senza distinzione tra maiuscole e minuscole (corretta, la parte _CI_ del nome Collation indica " C ase I nsensitive").

  4. Per quanto riguarda le seguenti dichiarazioni rilasciate da Jonathan Leffler sulla domanda:

    che entra in un'area molto delicata dell'interazione tra identificatori delimitati (normalmente distinzione tra maiuscole e minuscole) e regole di confronto (questo è insensibile al maiuscolo / minuscolo).

    No, gli identificatori delimitati normalmente non fanno distinzione tra maiuscole e minuscole. Le sensibilità (caso, accento, tipo kana, larghezza e avvio nel selettore di variazione di SQL Server 2017) degli identificatori delimitati sono le stesse degli identificatori non delimitati allo stesso livello. "Stesso livello" significa che i nomi a livello di istanza (database, accessi, ecc.) Sono controllati dalla fascicolazione a livello di istanza, mentre i nomi a livello di database (schemi, oggetti - tabelle, viste, funzioni, stored procedure, ecc. Utenti, ecc.) Sono controllati dal confronto a livello di database. E questi due livelli possono avere diverse regole di confronto.

    è necessario ricercare se i nomi delle colonne SQL in un database fanno distinzione tra maiuscole e minuscole quando sono delimitati. Può anche dipendere da come viene scritta l'istruzione CREATE TABLE (erano i nomi delimitati in questo?). Normalmente, SQL non fa distinzione tra maiuscole e minuscole nei nomi di colonne e tabelle; potresti scrivere INSERT INTO SoMeTaBlE(GiVeN, cOlNaMe) VALUES("v1", "v2") e se i nomi non sono mai delimitati, sarebbe OK.

    Non importa se i nomi delle colonne sono stati delimitati o meno durante la creazione della tabella, almeno non in termini di come viene gestita la loro risoluzione. I nomi delle colonne sono metadati a livello di database e sono controllati dalle regole di confronto predefinite del database. Ed è lo stesso per tutti i metadati a livello di database all'interno di ciascun database. Non è possibile avere nomi di colonne che fanno distinzione tra maiuscole e minuscole mentre altri non fanno distinzione tra maiuscole e minuscole.

    Inoltre, non c'è nulla di speciale nei nomi di tabelle e colonne. Si tratta di metadati a livello di database, proprio come i nomi utente, i nomi degli schemi, i nomi degli indici, ecc. Tutti questi metadati sono controllati dalle regole di confronto predefinite del database.

    I meta-dati (sia a livello di istanza che a livello di database) sono solo "normalmente" non sensibili al maiuscolo / minuscolo a causa delle regole di confronto predefinite suggerite durante l'installazione come collazione senza distinzione tra maiuscole e minuscole.

    un 'identificatore delimitato' è un nome di colonna, un nome di tabella o qualcosa di simile racchiuso tra virgolette, come ad esempio CREATE TABLE "table" (...)

    È più accurato dire che un identificatore delimitato è un identificatore racchiuso in qualunque carattere (s) il DBMS in questione ha definito come suoi delimitatori. E quali caratteri particolari vengono utilizzati per i delimitatori varia tra i diversi DBMS.

    In SQL Server, gli identificatori delimitati sono racchiusi tra parentesi quadre: [GIVEN]

    Mentre le parentesi quadre funzionano sempre come delimitatori per gli identificatori, è possibile utilizzare le doppie virgolette come delimitatori SE si ha la proprietà a livello di sessione di QUOTED_IDENTIFIER impostata su ON (che è sempre meglio fare sempre).

    Ci sono parti arcane in SQL (e la gestione dell'identificatore delimitato è una di queste)

    Bene, gli identificatori delimitati sono in realtà abbastanza semplici. L'intero punto di delimitazione di un identificatore è di ignorare efficacemente le regole degli identificatori regolari (cioè non delimitati). Ma, in termini di identificatori regolari, sì, quelle regole sono piuttosto arcane (principalmente a causa della incompleta e scorretta documentazione ufficiale). Quindi, per svelare come gli identificatori di SQL Server funzionano effettivamente, ho fatto un sacco di ricerche e ho pubblicato qui i risultati (che includono collegamenti alla ricerca stessa):

    Elenco completo di regole per gli identificatori T-SQL

Per maggiori informazioni su Collations / Encodings / Unicode / ASCII, in particolare per quanto riguarda Microsoft SQL Server, visitare:

Collations.Info



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché