【问题标题】:Unable to remove characters from a SQL string无法从 SQL 字符串中删除字符
【发布时间】:2017-05-25 08:40:14
【问题描述】:

我有一个包含多个字段的 SQL 表。在任何文本字段中,我感兴趣的字符串右侧都有重复的字符,如下所示:

'AAA........' -- 不幸的是,堆栈溢出正在修剪帖子中的字符(讽刺?)所以我已将它们替换为“。”试着给人留下印象。

当我运行下面的 sql 时,隐藏的字符似乎是空格:

SELECT ASCII(RIGHT(EXCHANGE, 1)) FROM T_TMP_INS -- Returns 32

如果我运行以下命令:

SELECT REPLACE(FIELD, CHAR(32), '@') FROM TABLE1

结果是:

AAA@@@@@@@@@@@@@@@@@@@@@@@

所以我假设我可以使用更新来删除空格字符:

UPDATE TABLE1 SET FIELD = REPLACE(FIELD, CHAR(32), '') 

但是更新并没有改变这个领域。

关于为什么选择识别并替换错误字符而更新语句不是,我是否有遗漏的原因?

感谢您的帮助。

【问题讨论】:

  • 列是如何定义的?我想它是 CHAR 或 NCHAR 而不是 VARCHAR 或 NVARCHAR,它们没有长度信息并用空格填充内容。

标签: sql tsql


【解决方案1】:

如果该字段被声明为例如char(10) 那么它将始终包含 10 个字符,并在末尾添加空格以弥补较短的字符串。

如果您想声明一列能够存储最多 10 个字符长的字符串,但又不想填充较短的值,则应将其声明为varchar(10)。 (类似地,ncharnvarchar)。

(如果您无法更改列声明并且只需要在检索期间对其进行修复,那么您应该首先将CASTCONVERT 发送到varchar/nvarchar 表单和然后 用RTRIM 修剪结尾)


您也可能想调整ANSI_PADDING 设置来改变这种行为。不过我建议不要这样做 - 这任何 SQL 数据库系统的标准行为,因此我建议使用它而不是使用非标准的产品特定解决方法。

【讨论】:

  • 这很有意义。在此响应之前,我不了解 char 和 varchar 之间的区别。刚刚删除了我的表并使用 varchar 重新创建了它。已加载数据,现在看起来很好,谢谢!
【解决方案2】:

如果字符是空格,您可以使用RTRIM(FIELD) 修剪它们。

如果还有前导空格,可以使用LTRIM(RTRIM(FIELD))

【讨论】:

  • 与替换一样,RTRIM 和 LTRIM 函数仅适用于 SELECT。使用 UPDATE 他们不再工作
  • 然后检查@Damien_The_Unbeliever提到的列的类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-16
  • 2019-06-06
  • 2016-04-13
  • 2014-05-13
  • 1970-01-01
  • 2019-01-01
  • 1970-01-01
相关资源
最近更新 更多