SQL Server列名称区分大小写

case-insensitive case-sensitive collation sqlbulkcopy sql-server

我使用的DB具有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

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

热门答案

鉴于这种信息关键部分(即关于该问题,而不是实际问题中留言):

实际上我使用Microsoft .Net的批量插入方法,所以我真的不知道它发送给数据库服务器的确切查询。

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

补充笔记

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

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

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

    实际上我使用Microsoft .Net的批量插入方法,所以我真的不知道它发送给数据库服务器的确切查询。

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

  3. 关于问题的“编辑”部分:

    不,即使您没有使用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中标识符实际工作方式的神秘面纱,我做了大量研究并在此发布了结果(其中包括研究本身的链接):

    完整的T-SQL标识符规则列表

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

Collat​​ions.Info



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因