SQL Server列名称区分大小写

时间:2012-05-03 14:09:28

标签: sql-server collation case-sensitive case-insensitive sqlbulkcopy

我使用的数据库具有French_CI_AS排序规则(CI应代表Case-Insensitive),但无论如何都是区分大小写的。我想了解原因。

我断言这一点的原因是带有'GIVEN'案例设置的批量插入失败,但是他们成功地使用了另一个'Given'案例设置。

例如:

  • INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES ("value1", "value2")失败,但
  • INSERT INTO SomeTable([Given],[ColName]) VALUES ("value1", "value2")有效。

修改 刚看到这个:

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

这意味着应该可以更改列的排序规则而不清空所有数据并重新创建相关表吗?

3 个答案:

答案 0 :(得分:3)

鉴于这一重要信息(即对问题的评论而不是 实际问题):

  

事实上我使用的是Microsoft .Net的批量插入方法,因此我并不确切知道它发送给数据库服务器的确切查询。

有意义的是,即使在不区分大小写的DB中,列名也会被视为区分大小写,因为这就是SqlBulkCopy类的工作方式。请参阅Column mappings in SqlBulkCopy are case sensitive

其他说明

  1. 在询问错误时,请始终在问题中包含实际完整错误消息。简单地说,有一个错误导致大量的猜测和疯狂的追逐,这反过来导致了偏离主题的答案。
  2. 在提问时,请不要改变您正在处理的情况。例如,问题陈述(强调添加):

      使用' GIVEN'

    批量插入案例设置失败,但他们成功与另一个'给予'案例设置。

    然而,示例语句是单INSERT个。此外,对该问题的评论指出:

      

    事实上我使用的是Microsoft .Net的批量插入方法,因此我并不确切知道它发送给数据库服务器的确切查询。

    使用.NET和SqlBulkCopy与使用BULK INSERTINSERT有所不同,使得当前的问题具有误导性,使得难以(甚至不可能)正确回答。这一新信息也会导致更多问题,因为在使用SqlBulkCopy时,您不会编写任何INSERT语句:您只需编写SELECT语句并指定名称目的地表。如果为目标表指定列名,则它位于可选列映射中。这是问题所在吗?

  3. 关于" EDIT"问题部分:

    不,即使您没有使用SqlBulkCopy,更改列的排序也根本没有帮助。列的排序规则确定列中存储的数据的行为方式,而不是列名称(即表的元数据)的行为方式。数据库本身的排序规则决定了数据库级对象元数据的行为方式。在这种情况下,您声称数据库使用不区分大小写的排序规则(正确,排序规则名称的_CI_部分表示" C ase I nsensitive"。)

  4. 关于Jonathan Leffler关于以下问题的陈述:

      

    进入一个非常微妙的分隔标识符(通常是区分大小写)和排序规则之间的交互区域(这个区分不区分大小写)。

    不,分隔标识符通常不区分大小写。分隔标识符的敏感性(大小写,重音,假名类型,宽度和SQL Server 2017变体选择器中的起始位置)与同一级别的非分隔标识符相同。 "同级别"表示实例级名称(数据库,登录等)由实例级排序规则控制,而数据库级别名称(模式,对象 - 表,视图,函数,存储过程等 - ,用户等)由数据库级排序规则控制。这两个级别可以有不同的排序。

      

    您需要研究数据库中的SQL列名称在分隔时是否区分大小写。它还可能取决于CREATE TABLE语句的编写方式(名称分隔在哪?)。通常,SQL对列和表名称不区分大小写;你可以写INSERT INTO SoMeTaBlE(GiVeN, cOlNaMe) VALUES("v1", "v2"),如果这些名字从不分隔,那就没关系。

    在创建表时,列名是否分隔无关紧要,至少在处理其分辨率方面不是这样。列名是数据库级元数据,由数据库的默认排序规则控制。并且每个数据库中的所有数据库级元数据都是相同的。您不能将某些列名称区分大小写,而其他列名称不区分大小写。

    此外,表名和列名没有什么特别之处。它们是数据库级元数据,就像用户名,模式名称,索引名称等一样。所有这些元数据都由数据库的默认排序控制。

    元数据(实例级和数据库级)只是"通常"由于安装期间建议的默认排序规则不区分大小写,因此不区分大小写。

      

    '定界标识符'是用双引号括起来的列名,表名或类似名称,例如CREATE TABLE" table"(...)

    更准确地说,分隔标识符是一个标识符,该标识符包含在所讨论的DBMS定义为其分隔符的任何字符中。哪些特定字符用于分隔符在不同的DBMS之间有所不同。

      

    在SQL Server中,分隔标识符用方括号括起来:[GIVEN]

    虽然方括号始终用作标识符的分隔符,但如果将QUOTED_IDENTIFIER的会话级属性设置为ON,则可以使用双引号作为分隔符(最好始终使用无论如何)。

      

    SQL有神秘的部分(分隔标识符处理就是其中之一)

    好吧,分隔标识符实际上非常简单。划定标识符的整个要点是有效地忽略常规(即非定界)标识符的规则。但是,就常规标识符而言,是的,这些规则相当晦涩(主要是由于官方文档不完整和不正确)。因此,为了揭开SQL Server中标识符实际工作方式的神秘面纱,我做了大量研究并在此发布了结果(包括研究本身的链接):

    Completely Complete List of Rules for T-SQL Identifiers

  5. 有关Collat​​ions / Encodings / Unicode / ASCII的更多信息,特别是与Microsoft SQL Server相关的信息,请访问:

    Collations.Info

答案 1 :(得分:0)

检查表定义中列的排序规则,以及tempdb数据库的排序规则(即服务器排序规则)。它们可能与您的数据库排序规则不同。

答案 2 :(得分:0)

列名称区分大小写意味着MASTER数据库是使用区分大小写的排序规则创建的。

如果我刚才引导我调查此事,有人进入了

Latin1_C S _A 而不是Latin1_C _A S

设置SQL Server时。