查看: 604|回复: 0

[Mysql数据库] mysql 关于命令行下,字符串间少逗号分隔符的坑

发表于 2018-4-4 08:00:02

遇到一个 mysql 的坑,关于字符串连接的问题,分享一下

  1. mysql> select * from my_table;
  2. +----+--------+------------+
  3. | id | mod_id | mod_name |
  4. +----+--------+------------+
  5. | 1 | 20 | red |
  6. | 2 | 20 | blue |
  7. | 3 | 20 | pink |
  8. | 4 | 21 | yellow |
  9. | 5 | 21 | green |
  10. | 6 | 21 | white |
  11. | 7 | 21 | black |
  12. | 8 | 30 | gray |
  13. | 9 | 30 | purple |
  14. | 10 | 30 | pinkpurple |
  15. | 11 | 30 | red purple |
  16. +----+--------+------------+
  17. 11 rows in set (0.00 sec)
复制代码

原始表数据。

  1. mysql> select * from my_table where mod_name in ("red", 'blue', 'pink', 'purple');
  2. +----+--------+----------+
  3. | id | mod_id | mod_name |
  4. +----+--------+----------+
  5. | 1 | 20 | red |
  6. | 2 | 20 | blue |
  7. | 3 | 20 | pink |
  8. | 9 | 30 | purple |
  9. +----+--------+----------+
  10. 4 rows in set (0.00 sec)
复制代码

使用 where 条件查询匹配列表中的列。(正常查询)

  1. mysql> select * from my_table where mod_name in ("red", 'blue', 'pink' 'purple');
  2. +----+--------+------------+
  3. | id | mod_id | mod_name |
  4. +----+--------+------------+
  5. | 1 | 20 | red |
  6. | 2 | 20 | blue |
  7. | 10 | 30 | pinkpurple |
  8. +----+--------+------------+
  9. 3 rows in set (0.00 sec)
复制代码

注意最后一组值,('pink' 'purple') 中间少了个逗号,那么查询出来的结果,默认会解释为 'pinkpurple' 字符串。

  1. mysql> select * from my_table where mod_name = ('pink' 'purple');
  2. +----+--------+------------+
  3. | id | mod_id | mod_name |
  4. +----+--------+------------+
  5. | 10 | 30 | pinkpurple |
  6. +----+--------+------------+
  7. 1 row in set (0.00 sec)
  8. 使用 = 符号条件精确查询,仍然解释为 两个字符串的连接结果。
  9. mysql> select * from my_table where mod_name = 'pink' 'purple';
  10. +----+--------+------------+
  11. | id | mod_id | mod_name |
  12. +----+--------+------------+
  13. | 10 | 30 | pinkpurple |
  14. +----+--------+------------+
  15. 1 row in set (0.00 sec)
  16. 使用 = 符号条件精确查询,取消掉括弧,仍然解释为 两个字符串的连接结果。
  17. mysql> select * from my_table where mod_name = '' 'purple';
  18. +----+--------+----------+
  19. | id | mod_id | mod_name |
  20. +----+--------+----------+
  21. | 9 | 30 | purple |
  22. +----+--------+----------+
  23. 1 row in set (0.00 sec)
  24. 头一个字符串为0长度字符串,那么合并即等于 purple 字符串。
  25. mysql> select * from my_table where mod_name = 'red'' ' 'purple';
  26. Empty set (0.00 sec)
  27. 写三个字符串,其中第一个字符串的单引号和第二个字符串的单引号中间没有空格,那么解释为未知字符。。。。。
  28. mysql> select * from my_table where mod_name = 'red' ' ' 'purple';
  29. +----+--------+------------+
  30. | id | mod_id | mod_name |
  31. +----+--------+------------+
  32. | 11 | 30 | red purple |
  33. +----+--------+------------+
  34. 1 row in set (0.00 sec)
  35. 'red' ' ' 'purple' ,每一组字符串用空格隔开,那么就合并为 red purple 字符串。
复制代码

本来,这应该报语法错误的,但是,,,,,
唉,被坑了,,,,



回复

使用道具 举报