MySQL CONCAT '*' 符号向数据库敬酒

Posted

技术标签:

【中文标题】MySQL CONCAT \'*\' 符号向数据库敬酒【英文标题】:MySQL CONCAT '*' symbol toasts the databaseMySQL CONCAT '*' 符号向数据库敬酒 【发布时间】:2012-10-07 13:27:20 【问题描述】:

我有一个用于查找的表,该表将人类可读的值存储在一个列中,并且将删除特殊字符和空格的相同文本存储在另一列中。例如,值“Children's Shows”将在查找列中显示为“childrens-shows”。

不幸的是,对应的主表并不是那么简单——由于历史原因,我没有自己创建,现在很难撤消,查找值实际上是与周围的星号一起存储的,例如'*儿童节目*'。

因此,在尝试将无星号查找表与带有星号的主表连接时,我认为 CONCAT 会帮助我即时添加它们,例如;

    SELECT * 
      FROM main_table m 
INNER JOIN lookup_table l 
        ON l.value = CONCAT('*',m.value,'*')

...然后桌子就烤好了。不确定我是创建了一个无限循环还是真的搞砸了数据,但它需要一个 ISP 备份才能让表再次响应。我怀疑这是因为“*”符号可能是保留的,就像通配符一样,我已经要求数据库执行相当于舔自己的肘部的操作。无论哪种方式,鉴于它设法杀死数据库的壮观方式,我都不愿“实验”以找到答案。

提前感谢任何可以 (a) 告诉我上述内容对数据库实际做了什么,以及 (b) 我应该如何实际加入表的人?

【问题讨论】:

+1 让分贝舔自己的肘部。而且,因为我很好奇问题可能是什么。 main_table 中有多少条记录? 我认为您的加入应该在两个表上都有一些共同的 id 请尝试应用限制。 主表中大约 15K,查找中大约 10K。 阿伦 - 你错过了问题的关键。值是普通值,但是加了星号是历史的,现在加上记录数,很难撤消。 【参考方案1】:

使用 CONCAT 时,mysql 不会使用索引。使用 EXPLAIN 来检查这一点,但我最近遇到的一个问题是,在一张大表上,索引列在那里,但没有使用键。然而,这不应该让整个桌子感到厌烦,只是让它变慢。可能是内存不足,开始交换,然后中途崩溃,但您需要查看日志才能找到答案。

但是,根本原因显然是糟糕的表格设计,而这正是解决方案所在。您得到的任何可以解决此问题的答案最多只能是暂时的。

最好的解决方案是将这些数据移动到一个单独的表中。 “儿童节目”听起来像是一个类别,因此在许多行中重复数据。这实际上应该是“类别”表的 id,这将防止数据库必须在表中的每一行上运行 CONCAT,因为您可以这样做:

    SELECT * 
      FROM main_table m 
INNER JOIN lookup_table l 
        ON l.value = m.value
   /* and optionally */
INNER JOIN categories cat
        ON l.value = cat.id
     WHERE cat.name = 'whatever'

我知道,鉴于您在问题中提供的信息,您可能无法做到这一点,但实际上无法对严重标准化的数据库进行此类更改的原因比此处的代码更重要。如果没有资源或政治支持以正确的方式做事,你最终会遇到更多这样的麻烦,从长远来看,这最终会花费更多。也许是时候和老板谈谈了:)

【讨论】:

以上是关于MySQL CONCAT '*' 符号向数据库敬酒的主要内容,如果未能解决你的问题,请参考以下文章

MySQL CONCAT 多个唯一行

mysql groupby 字段合并问题(group_concat)

mysql中将多行数据合并成一行数据

mysql 向字段添加数据或者删除数据

MYSQL通过循环向数据库中插入数据

一些注入的姿势以及函数利用