【问题标题】:Case insensitive custom replace() function不区分大小写的自定义 replace() 函数
【发布时间】:2013-10-08 16:38:37
【问题描述】:

我正在尝试对数据库进行批量替换,以翻译英式到美式单词。我有大量的单词要替换,还有一系列不同的表格要运行。我遇到了following thread,它似乎提供了我所需要的东西,但是我在尝试时遇到了错误。

这是我遇到的错误。

Exception caught: exception 'PDOException' with message
'SQLSTATE[HY000]: General error: 1436 Thread stack overrun:
10816 bytes used of a 131072 byte stack, and 128000 bytes needed.
Use 'mysqld -O thread_stack=#' to specify a bigger stack.' in /var/.../....php:303
Stack trace: #0 /var/.../....php(303): PDOStatement->execute(Array) #1 {main}

我正在使用this answer 中自定义的 MySQL 函数并生成如下所示的查询;

UPDATE field_data_body SET body_value = case_insensitive_replace(body_value, :british, :american)

我正在使用以下内容来处理 PDO;

$query = $db->prepare($sql);
try {
    $query->execute($sql_fields_array);
} catch (PDOException $e) {
    echo "Exception caught: $e";
}

$sql_fields_array 数组如下所示;

Array ( [british] => acclimatise [american] => acclimate )

我已经测试了更改自定义函数的名称以确保我正确地创建了它,但我确实收到了一条错误消息,指出函数名称不存在。所以至少我尝试过的那部分是正确的。

最初我使用replace(lower(body_value), :british, :american) 进行搜索和替换,但是这随后将所有内容更改为小写,这不是我想要的。

关于这个错误的任何想法?或者,如果实际上有更好的方法,我可以自动执行批量搜索和替换。

【问题讨论】:

  • 你可以看看stackoverflow.com/questions/2919558/…,它提供了关于“thread_stack”东西的信息。
  • 所以这是一种没有足够的内存来执行操作类型的问题?提高线程堆栈限制有什么危险吗?我的似乎是 128K
  • 我不是专家,但除了在同时运行大量批次的情况下会消耗全局内存外,我认为提高 thread_stack 值会很好。
  • 好吧,至少目前看来还可以。我已将其提高到 256K,这次查询运行了!谢谢。

标签: php mysql pdo replace user-defined-functions


【解决方案1】:

查询似乎运行良好。将线程堆栈从 128K 提升到 256K 后,查询成功执行。请注意,它花了 20 到 30 秒的时间,但运行的时间却不少。

增加此限制后,我没有注意到对服务器有任何不利影响。

【讨论】:

    【解决方案2】:

    似乎与MySQL error 1436: Thread stack overrun, with simple query 重复。

    由于没有评论权,所以在这里发布。

    问候

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 2011-01-11
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多