【问题标题】:Need to use temporary variable to make REPLACE of SUBSTRING_INDEX work需要使用临时变量来使 SUBSTRING_INDEX 的 REPLACE 工作
【发布时间】:2016-08-12 04:06:41
【问题描述】:

我们在多个 Debian 服务器上运行 MySQL 5.5.47。在其中一些上,我们看到了以下奇怪的行为:

mysql> set @TKEY:='ARDARD:fae590c4.ffa2.11e5.a318.0cc47a39aeb4-1460351116';  
mysql> select replace(substring_index(substring_index(@TKEY,':',-1),'-',1), '.','-') as guid;
+--------------------------------------+
| guid                                 |
+--------------------------------------+
| fae5a2.1--0cc47a 9ae47a 9aeb4a 9aeb4 |
+--------------------------------------+

这应该提取@TKEY 的中间部分(在:- 之间)并用连字符替换所有句点。空间从何而来?结果的其他部分似乎混乱了:9aeb4 已重复,a2.1 已向左移动。

如果我将 substring_index 分配给中间变量,则不会发生这种情况。

mysql> set @temp = substring_index(substring_index(@TKEY,':',-1),'-',1);
mysql> select replace(@temp, '.', '-') as guid;
+--------------------------------------+
| guid                                 |
+--------------------------------------+
| fae590c4-ffa2-11e5-a318-0cc47a39aeb4 |
+--------------------------------------+

这只发生在我们的生产服务器上。我无法在我们的开发服务器或 sqlfiddle 上重现它。我比较了所有服务器变量,看起来它们应该影响字符串函数的行为没有任何差异(最初在字符集和排序规则变量方面存在一些差异,但我更改了开发服务器以匹配生产服务器,但仍然无法'不要复制错误。

在另一台运行 MySQL 5.5.41 的生产服务器上,我得到一个稍微不同的错误结果:

mysql> select replace(substring_index(substring_index(@TKEY,':',-1),'-',1), '.','-') as guid;
+--------------------------------------+
| guid                                 |
+--------------------------------------+
| fae590c4-ffa2-11e5-a318-0cc47a 9aeb4 |
+--------------------------------------+

这是正确的,只是最后一个3 有一个空格。

谁能解释一下?它只是一个MySQL错误吗?我在 bugs.mysql.com 上找不到任何东西。

【问题讨论】:

  • sqlfiddle 5.5 也给出了奇怪的结果。也可以通过使用中间临时变量来解决...我认为你发现了一个主要错误
  • 所以我想这可能是 5.6 中修复的错误。我搜索已关闭的错误时找不到它,但这看起来有点相似:bugs.mysql.com/bug.php?id=60166

标签: mysql substring


【解决方案1】:

这似乎是 MySQL 5.6.5 中修复的错误。关于LOWER(SUBSTRING_INDEX(...)),有一个类似的错误报告。它以评论关闭:

在 5.6.5 更新日志中注明。

SUBSTRING_INDEX() 的结果在使用时可能会丢失字符 作为 LOWER() 等转换函数的参数。

我怀疑根本原因是指​​针滥用导致缓冲区溢出和未定义的行为。希望我没有损坏服务器中的任何长期内存。

【讨论】:

  • 不错的发现,通过以不同顺序调用它的建议修复方法也适用于您的示例
  • 太棒了.. 点赞。听着,我想知道你对the only answer which is under my question 的看法。你能看一下吗?告诉我这样好吗?可以更好吗?还是不好?等等。
猜你喜欢
  • 1970-01-01
  • 2017-03-04
  • 2012-04-06
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多