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值进行比较.
创建一个检查约束,将实际值与较低值进行比较:
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可能也适用于电子邮件.