2016-09-30 98 views
2

我花了很多时间试图找出这一点......看着其他几十个答案。SQL如何删除所有的ASCII字符(空白字段输入后空白)

我在SQL Server中有一个表类型为Char(32) NULL的表。表格栏中的所有项目只有char(9),但其余位置有空白(运行select ascII(right(myField, 1))时有32个)。

我已经尝试了更换,尝试更新的领域从不是Temptable试图从tempTbl删除和更新.....每次我选择...领域仍然30长。

有没有办法去除所有多余的空格?或者这只是CHAR字段总是工作的方式?

我曾尝试:

UPDATE table 
SET myfield = rtrim(replace(myField , char(160), char(32))) 

UPDATE mytable 
SET myField = REPLACE(RTRIM(LTRIM(myField)), CHAR(32), '') 
+3

由于数据类型是CHAR(32),因此值将始终为32个字符。这将右键填充空格值直到达到32位。如果不想填充空格,应考虑使用varchar(32)。 –

回答

2

必须区分字符串与固定宽度

  • 串与可变宽度

    之间

    在你的情况,你是在处理一个固定的宽度。这意味着,该字符串始终填充到其定义的长度。 固定宽度字符串与datetime或int值一起在之内的行。

    如果您将列定义为VARCHAR(32)(意思是可变字符),则“32”仅限制最大长度。这些值被存储在(大多数情况下)的某个地方以外的行的存储空间,同时有只有一个指针的实际存储位置的行内。

    固定长度稍微快于可变字符串。但在大多数情况下,我建议更喜欢VARCHAR(x)

    检查了这一点:

    DECLARE @fix CHAR(32)='test'; 
    DECLARE @variable VARCHAR(32)='test'; 
    
    SELECT LEN(@fix),DATALENGTH(@fix) 
         ,LEN(@variable),DATALENGTH(@variable) 
    

    导致

    4,32,4,4 
    
    • LEN()功能全不计尾随空格
    • DATALENGTH() - 函数给你实际使用的空间为
  • +0

    好的解释....好的...是的,所以我想我们将不得不改变为varchar以获得我们真正需要的东西。非常感谢。 – KAT

    0

    CHAR(32)将占据所有32个字符。

    如果你想修剪并存储它,你应该使用varchar(32)。

    尝试将您的字段转换为varchar。