在sql中为列添加小写约束

Aeo*_*ify 4 sql sql-server sql-server-2008

我搜索了网页,但发现只有如何将列更新为小写.有没有办法在列中放置约束,以便它只接受小写,并在我们尝试以大写形式插入某些内容时出错.

表格如下:

create table Student
(
  ID int,
  Name varchar(50),
  Email varchar(50)
);
Run Code Online (Sandbox Code Playgroud)

jpw*_*jpw 10

您可以对此函数使用check约束binary_checksum:

alter table student add check (binary_checksum(email) = binary_checksum(lower(email)));
Run Code Online (Sandbox Code Playgroud)

您还可以在其中使用多个条件check,因此您还可以检查电子邮件地址是否包含@字符等,尽管处理需求会增加:

check (binary_checksum(email) = binary_checksum(lower(email)) and charindex('@', email) > 0);
Run Code Online (Sandbox Code Playgroud)

检查插入它的客户端应用程序中的输入可能会更好,或者使用触发器或存储过程来处理插入并强制数据为小写.

引用SQL Server手册:

CHECKSUM和BINARY_CHECKSUM为字符串数据类型返回不同的值,其中locale可以使具有不同表示的字符串进行比较相等.字符串数据类型是char,varchar,nchar,nvarchar或sql_variant(如果sql_variant的基本类型是字符串数据类型).例如,字符串"McCavity"和"Mccavity"的BINARY_CHECKSUM值是不同的.相反,在不区分大小写的服务器中,CHECKSUM为这些字符串返回相同的校验和值.不应将CHECKSUM值与BINARY_CHECKSUM值进行比较.

  • 啊,比使用`collat​​e`操作符的解决方法要好得多. (2认同)
  • 谢谢,这很有效.我现在会尝试在客户端进行此操作.我还在学习基础知识,这就是为什么我想知道它是否有效:p (2认同)
  • @a_horse_with_no_name - 我不同意。`lower(email) = email COLLATE Latin1_General_CS_AI` 对我来说更清晰,不容易发生冲突。 (2认同)

a_h*_*ame 5

创建一个检查约束,将实际值与较低值进行比较:

create table Student
(
  ID int,
  Name varchar(50),
  Email varchar(50),
  constraint check_lowercase_email check (lower(email) = email)
);
Run Code Online (Sandbox Code Playgroud)

但是,如果您的默认排序规则不区分大小写,则上述情况不起作用,在这种情况下,您需要执行以下操作:

create table Student
(
  ID int,
  Name varchar(50),
  Email varchar(50),
  constraint check_lowercase_email check (lower(email) = email COLLATE Latin1_General_CS_AI )
);
Run Code Online (Sandbox Code Playgroud)

您使用哪种排序规则取决于数据库的默认排序规则,但通常有一个CS版本可用,表示"不区分大小写".Latin1_General_BIN可能也适用于电子邮件.