Sql 将ASCII(子)集传输到表

Sql 将ASCII(子)集传输到表,sql,sql-server,database,relational-database,ascii,Sql,Sql Server,Database,Relational Database,Ascii,我试图将ASCII字符的子集传输到表中,但不断收到一个错误,称我在SSMS中复制值 这是我的表格代码: create table xyz( aChar char not null, primary key(aChar) ); declare @xChars int = 250 declare @iterations int = 0 while @iterations < @xChars begin insert into xyz values (char(@iterations)

我试图将ASCII字符的子集传输到表中,但不断收到一个错误,称我在SSMS中复制值

这是我的表格代码:

create table xyz(
  aChar char not null,
  primary key(aChar)
);
declare @xChars int = 250
declare @iterations int = 0
while @iterations < @xChars
begin
insert into xyz values (char(@iterations))
set @iterations += 1
end
这将填充表格:

create table xyz(
  aChar char not null,
  primary key(aChar)
);
declare @xChars int = 250
declare @iterations int = 0
while @iterations < @xChars
begin
insert into xyz values (char(@iterations))
set @iterations += 1
end

希望你们中的一位能在这里帮助我。

问题在于不区分大小写的排序规则。”“a”和“a”是一回事。因此,请使用区分大小写的排序规则:

create table xyz (
  aChar char collate SQL_Latin1_General_CP1_CS_AS not null,
  primary key(aChar)
);
您可以使用一条语句来执行此操作:

with nums as (
      select 1 as n
      union all
      select n + 1
      from nums
      where n + 1 < 250
     )
insert into xyz (aChar)
    select char(nums.n)
    from nums
options (maxrecursion 0);
这是一个SQL小提琴

也可以使用计算列执行此操作:

create table xyz(
  aChar_num smallint not null,
  aChar as (char(aChar_num)),
  primary key(aChar_num)
);

with nums as (
      select 1 as n
      union all
      select n + 1
      from nums
      where n + 1 < 250
     )
insert into xyz (aChar_num)
    select nums.n
    from nums
    option (maxrecursion 0);

如SQL FIDLE所示。

SQL Server中的字符数据与排序规则一起存储。排序规则定义文本的排序顺序和相等比较。默认排序规则不区分大小写,因此字符“a”和字符“a”比较时相等。aChar上有一个唯一的索引,因此不能在列中存储“a”和“a”。也可能会有空白或不可打印的字符进行比较

您希望使用二进制排序规则声明该列,以便字符按其代码点进行比较,而不是按语言排序规则进行比较。乙二醇

drop table if exists xyz
create table xyz(
  aChar char  collate Latin1_General_BIN2 not null,
  primary key(aChar)
);
go
declare @xChars int = 250
declare @iterations int = 0
while @iterations < @xChars
begin
insert into xyz values (char(@iterations))
set @iterations += 1
end

在开始循环之前,请截断表:truncate table xyz.ASCII只有128个代码点,因此实际上您没有在ASCII中工作。CHAR和ASCII函数也不使用ASCII。您应该了解所需的字符集和编码,并仔细选择排序规则和文本类型。对于文本类型,NCHAR和NVARCHAR通常比CHAR和VARCHAR更好。但是两倍的字节。这澄清了很多。非常感谢。也谢谢你的帮助。