被分割的字段一定是有限而且数量较少的,我们不可能在一个字符串中存储无限多个字符

这个字段所属的表与这个字段关联的表,一定是一对多的关系

比如下面这个表结构所代表的content与tag这两个对象 代码如下:

mysql> SELECT * FROM content;

+----+------+| id | tags | +----+------+| 1 | 1,2 | | 2 | 2,3 | +----+------+

2 rows in set (0.01 sec)

mysql> SELECT * FROM tag;

+----+-------+| id | name | +----+-------+| 1 |

php | | 2 | mysql | | 3 | java | +----+-------+

3 rows in set (0.00 sec)

这些原则问题,相信大家在开发过程中已经很熟悉了。但是你在使用这种方法来处理实际问题时,内心一定还是有些许忐忑,因为这种方法或多或少看上去有点像野路子。在那本厚厚的《数据库》教材中,也没有提到这种设计方法,标准的方法似乎是应该使用一个关系映射表在这两个表之间插一杠子,尽管这样会使用效率低下的连接查询。

每个开发者都曾纠结于标准与效率,但我想我们的努力能使这种方法的使用看起来更加标准。注意,以下讨论的使用方法仅限于mysql,但其它数据库应该可以移植。 相关性检索

很多开发者还在使用古老的LIKE方法来实现相关性检索,比如上面那个数据库结构中,content表中的两条记录都有2这个tag,那么怎样在我取出记录1时,把与它tag相关的记录也显示出来呢。其实这也是CMS需要面对的一个基本问题,也就是相关内容的查询。

如果你是一个菜鸟,你可能只会想到LIKE方法,比如先把记录1取出来,然后再把tags字段按逗号分割,最后做一个循环用LIKE检索content表中所有tags字段中包含2的记录,类似这样 代码如下:

SELECT * FROM content WHERE tag LIKE '%2%' AND id <> 1

但这种方法实在是太慢了,查询次数多不说,LIKE查询本来就是一个比较慢的方法。而且你还要处理前后逗号的问题,总之麻烦是一大堆。

所以让我们静下心来翻翻mysql手册,看看有没有什么惊喜。这个时候,一个名为FIND_IN_SET的函数,会闪着金光映入你的眼帘。让我们看看这个函数的定义 代码如下:

FIND_IN_SET(str,strlist)

Returns a value in the range of 1 to N if the string str is in the string list strlist consisting of N substrings. A string list is a string composed of substrings separated by “,” characters. If the first argument is a constant string and the second is a column of type SET, the FIND_IN_SET() function is optimized to use bit arithmetic. Returns 0 if str is not in strlist or if strlist is the empty string. Returns NULL if either argument is NULL. This function does not work pro

perly if the first argument contains a comma (“,”) character.

哦,PERFECT! 简单说来就是寻找一个字符串是否在另一个以逗号分割的字符串中存在的函数,这简直是为我们量身定做的。那么我们的sql就变成 代码如下:

SELECT * FROM content WHERE FIND_IN_SET('2', tags) AND id <> 1

在翻这些函数的过程中,你应该已经深深地体会到mysql的设计者对以逗号分割存储字段方法的肯定,因为有很多方法就是设计用来处理这种问题的。

这样看起来好多了,一切似乎完美了,是这样吗?其实还没有,如果你的tag比较多,你需要创建多个sql语句,而且有的记录关联的tag比较多,有的比较少,怎么能按照相关性进行排列呢。

这个时候,你可以关注mysql的全文检索功能。这个词你肯定看见过无数回了,但是这么使用的肯定很少,让我们直接看语句吧 代码如下:

SELECT * FROM content WHERE MATCH(tags) AGAINST('1,2') AND id <> 1

这个语句的优势是显而易见的,你不需要对tags字段做再次分割。那么这种查询的原理是什么呢,稍微了解下MATCH AGAINST的用法就知道,全文检索的默认分隔符是标点符号和stopwords,其中前者正是我们需要的特性。全文检索按照逗号将MATCH和 AGAINST里的字符串做分割,然后将它们匹配。

需要注意的是上面sql仅仅是个例子,如果你直接这么执行,是无法得到任何结果的。原因在以下

cache="0" sizset="10"> 你需要对tags字段建立fulltext索引(如果仅仅是测试,可以不做,建索引只是提高性能,对结果没有影响)

每个被标点符号分割的word长度必须在3个字符以上,这才是关键,我们的tag id太短了,会被自动忽略掉,这个时候你可以考虑让id从一个比较大值开始自增,比如1000,这样它就够长了。 你撞到了s

topwords,比如你的tags字段是这样的'hello,nobody',nobody是mysql的一个默认的 stop words,它会被自动忽略。stop words是英文中的一些无意义词,搜索的时候不需要它们,类似汉语中的助词等等。但在我们的使用中显然不是用来做搜索的,因此可以在my.cnf文件 里,加上

ft_stopword_file=''来禁用它

mysql之设置字段分隔符_mysql字段中使用逗号分隔符相关推荐

  1. mysql字段中有逗号隔开_在MySQL字段中使用逗号分隔符

    大多数开发者应该都遇到过在mysql字段中存储逗号分割字符串的经历,无论这些被分割的字段代表的是id还是tag,这个字段都应该具有如下几个共性.被分割的字段一定是有限而且数量较少的,我们不可能在一个字 ...

  2. mysql密码字段类型_MySQL 字段类型

    数值 MySQL 的数值数据类型可以大致划分为两个类别,一个是整数,另一个是浮点数或小数. 许多不同的子类型对这些类别中的每一个都是可用的,每个子类型支持不同大小的数据,并且 MySQL 允许我们指定 ...

  3. mysql 增加字段位置靠前_mysql 字段指定值靠前排序方法,多字段排序排序方法

    背景:SEO下选择某查询条件 查询展示信息为装修设计师以及设计师作品.设计师原型设计为:选择某风格 例如:简约,则列表出现拥有简约风格的设计师信息以及该设计师类型为简约的作品(3条靠前记录) 浏览原型 ...

  4. web项目查询mysql中文显示为问号_MySQL 表中的中文显示为问号

    文章目录 1 问题:MySQL数据库中的中文显示为问号 2 解决思路 2.1 查看字符集 2.2 修改my.ini 2.3 重启mysql 2.4 验证字符集生效 3 其他 3.1 修改表的编码格式 ...

  5. mysql 字段字节_MySql字段类型及字节

    字段类型: TINYINT-----------------一个很小的整数.有符号的范围是-128到127,无符号的范围是0到255. SMALLINT--------------一个小整数.有符号的 ...

  6. mysql完整字段包括_MySQL字段类型最全解析

    前言: 要了解一个数据库,我们必须了解其支持的数据类型.MySQL 支持大量的字段类型,其中常用的也有很多.前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类型,本篇 ...

  7. mysql密码字段类型_MySQL字段类型最全解析

    **前言:** 要了解一个数据库,我们必须了解其支持的数据类型.MySQL 支持大量的字段类型,其中常用的也有很多.前面文章我们也讲过 int 及 varchar 类型的用法,但一直没有全面讲过字段类 ...

  8. mysql字段说明_mysql 字段类型说明

    MySQL支持大量的列类型,它可以被分为3类:数字类型.日期和时间类型以及字符串(字符)类型.本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述.概 ...

  9. mysql 结果字段截取_mysql字段截取(转)

    函数: 1.从左开始截取字符串 left(str, length) 说明:left(被截取字段,截取长度) 例:select left(content,200) as abstract from my ...

最新文章

  1. 解决了一个小问题 好像把逻辑有点复杂
  2. Spring4新特性——核心容器的其他改进
  3. html中盒子模型立体结构图
  4. 中信证券:维持贝壳“买入”的投资评级
  5. 1195.最长最短文本
  6. openwrt添加自己的iptables的targe编译报错
  7. 谷歌发布GPhone 创始人亲自上阵
  8. n服登陆显示从服务器断开,魔兽世界N服卡认证、断开连接的解决方法
  9. 一文通俗入门·脉冲神经网络(SNN)·第三代神经网络
  10. 椭圆抛物面matlab程序,椭圆抛物面画法.pdf
  11. scipy 三次样条插值
  12. sparse_categorical_crossentropy的使用
  13. MySQL中的describe关键字
  14. JetBot之旅(1)
  15. Android okgo获取数据
  16. 连接手机传输驱动安装问题
  17. bios error 装系统acpi_大神详解win10系统升级后开机提示acpi bios error的设置技巧
  18. Java学习路线之并发编程(五)
  19. EPC模式和施工总承包的区别
  20. UVa10391 复合词

热门文章

  1. 学习需要的是 韧劲 坚持不懈
  2. 【读书向】阿里云天池大赛赛题解析——总结
  3. 4. 美赛建模总结-3-最佳巧克力蛋糕烤盘(连续)-示例模型
  4. Python运行速度慢怎么办?
  5. 月销涨3倍:阿里巴巴零售通联合饿了么宣布将赋能近万天猫小店
  6. 游戏设计/开发的出发点——追根溯源
  7. C++软件工程师之什么是宏?
  8. 游戏制作RPGDreamer
  9. 自适共振神经网络算法 ART 算法 代码实现
  10. 在线音频mp3、视频mp4测试地址