【发布时间】:2012-05-13 01:44:28
【问题描述】:
我使用的数据库有 French_CI_AS 排序规则(CI 应该代表不区分大小写),但无论如何都是区分大小写的。我正在尝试了解原因。
我断言这一点的原因是带有“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
这意味着应该可以在不清空所有数据并重新创建相关表的情况下更改列的排序规则?
【问题讨论】:
-
我认为您需要用一个简单的(2 列)示例说明什么有效,什么无效。我想你可能会说
INSERT INTO SomeTable([GIVEN],[COLNAME]) VALUES (...)失败但INSERT INTO SomeTable([Given],[ColName]) VALUES (...)有效。如果是这样,这就涉及到分隔标识符(通常区分大小写)和排序规则(这个不区分大小写)之间交互的一个非常微妙的领域。 -
@JonathanLeffler :您的示例与我的问题完全相关。
-
您需要区分存储在表中的内容(数据)和存储在系统目录中的名称(元数据)。如果如您所指出的,问题出在列名(而不是数据本身)上,那么您需要研究数据库中的 SQL 列名在分隔时是否区分大小写。它还可能取决于 CREATE TABLE 语句的编写方式(名称是否在其中分隔?)。通常,SQL 对列名和表名不区分大小写;你可以写
INSERT INTO SoMeTaBlE(GiVeN, cOlNaMe) VALUES("v1", "v2"),如果名字从不分隔,那就没问题了。 -
@Jonathan Leffler:这里的“delimited”代表什么...?
-
在标准 SQL 中,“分隔标识符”是列名、表名或用双引号括起来的类似内容,例如
CREATE TABLE "table"(...)。它们用于名称是关键字或包含标识符中通常不允许的字符(例如空格)时。在 SQL Server 中,分隔标识符用方括号括起来:[GIVEN]等。MySQL 对同一作业使用反引号。这就是为什么向我们展示您正在使用的内容至关重要的原因。 SQL 有一些晦涩难懂的部分(分隔标识符处理就是其中之一),但当你遇到它时,你必须学习。
标签: sql-server collation case-sensitive case-insensitive sqlbulkcopy