在SQL Server 2008中,我创建了下表:
CREATE TABLE [Items](
[ID] [uniqueidentifier] NOT NULL,
[Stock_ID] [uniqueidentifier] NOT NULL,
[Code] [nvarchar](36) NOT NULL,
[RFCODE] [nvarchar](24) NOT NULL
)
当我插入新行时:
insert into Items
values ('34438913-6CB0-43AD-9DD5-5FBFFC60B313', '70667244-6F03-4113-930E-BF66CF1C29EE', 'MX7A386CHGR5WW', 'BE0000000000000000000162')
Code
列的长度为36,这意味着SQL Server会向MX7A386CHGR5WW
添加尾随空格。
如何避免这种行为? (code
列可以在10到36个字符之间变化)
答案 0 :(得分:2)
否 - SQL Server执行 NOT 将任何尾随空格添加到定义为nvarchar
的列中!
它会存储与传入的字符完全相同的字符 - 不再存在!
char
和nchar
数据类型将填充到定义的长度 - 但 NOT (n)varchar
类型!
如果您在插入后运行此查询,则会发现您的陈述错误:
SELECT
*, LEN(Code), '[' + Code + ']'
FROM Items
您会看到14
Code
列的长度,并在Code
列周围放置方括号,清楚地显示已添加无尾随空格。
如果您向表格添加NCHAR(36)
类型的列
ALTER TABLE Items
ADD CodeFixed NCHAR(36)
然后将其值设置为MX7A386CHGR5WW
UPDATE Items
SET CodeFixed = 'MX7A386CHGR5WW'
WHERE ID = '34438913-6CB0-43AD-9DD5-5FBFFC60B313'
然后当你检查时,你会发现nchar(36)
实际上是用空格填充到定义的最大长度:
SELECT
LEN(Code), '[' + Code + ']',
'[' + CodeFixed + ']'
FROM Items
答案 1 :(得分:0)
Code
列的类型为nvarchar
,这意味着最多允许36个字符。如果输入长度小于36,它将不会填充,这是nchar
将要完成的。