【问题标题】:Left function leaving out characters左函数省略字符
【发布时间】:2018-03-30 17:08:09
【问题描述】:

我有一个包含 1000 多个数字的数据库,格式大致相同:aaa-111-2222

有些数字末尾有多余的部分:aaa-111-2222(bbbb)

我创建了一个列并使用左函数更新了我的表:

UPDATE table_1
SET col_2 = Left(col_1, 12)

我想更新整个表,所以我没有包含 WHERE 函数。 问题是当它更新时,它会遗漏两个字符。

Col_1: aaa-111-2222(bbbb)

函数运行时返回:

Col_2: aaa-111-22 

这是短字符。我认为可能有一些我看不到的前导空格,所以在原始列中我:

SELECT REPLACE(Col_1, " ","") FROM table_1

然后我重新运行了我的更新,但它仍然返回很短。我想也许我有额外的回报和其他空白,所以我跑了:

SELECT REPLACE(REPLACE(Col_1, CHAR(13), ''), CHAR(10), '') FROM table_1

然后我删除了 Col_2 并重新制作了它。结构是 VARCHAR,长度为 15(比我应该拥有的多 3 个) 在我再次运行 UPDATE 后,它仍然很短 2 个字符。

关于我还能做些什么来解决的任何想法?

【问题讨论】:

  • 只是为了好玩,你能不能插入一个只有数字/字母,没有特殊字符的记录,看看问题是否仍然存在?
  • 我无法重现该问题,请参阅db-fiddle。检查col_1 列中每条记录的长度。
  • 我正在查看数据,经过仔细检查后发现,我超过了 16,000 行,而不是 5,000 行。不知何故,我的数据被重复了,所以我删除了表格并上传了我的备份。之后,重置工作。感谢您的建议
  • 解决了你的问题吗?如果是,请将其标记为已解决或未解决

标签: mysql sql


【解决方案1】:

col_1 中可能有前导空格。 REPLACE 没有更新 col_1,因为它只应用了 SELECT 的结果数据集。尝试使用TRIM 消除前导和尾随空格,看看是否有任何区别:

UPDATE table_1
SET col_2 =  Left(TRIM(col_1), 12) ; 

也试试这个:

UPDATE table_1
SET col_2 = LEFT(TRIM(REPLACE(REPLACE(col_1,'\r',''),'\n','')), 12);

【讨论】:

  • 我试过了,同样的问题仍然存在。它不会影响每一行,看起来大约一半是正确的,另一半是短的。
【解决方案2】:

我最终注意到我的桌子比应有的大 3 倍。我清空了表,用我拥有的备份数据重新加载了它,然后执行了 REPLACE,之后它工作得很好。

谢谢你们的提示。

【讨论】:

    猜你喜欢
    • 2020-12-14
    • 2016-06-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多