如何使用分号分隔符从 MariaDB 获取数据?

Posted

技术标签:

【中文标题】如何使用分号分隔符从 MariaDB 获取数据?【英文标题】:How get data from MariaDB using semicolon delimiter? 【发布时间】:2015-06-05 10:09:20 【问题描述】:

我有 MariaDB 5.5.x 引擎的数据库。在数据库上,我有表“项目”:

Table "items"
------------
ID |name      | location | ... |
--------------------------
1  |some name1| 3;56;23;15;4; |
-----------------------
2  |some name2| 4;8;90;   |
-----------------------
3  |some name3| 6;27;18;87;|

当我知道 location_ID fx 时,我正在寻找获取 ID 的方法。 “90”。所有位置都在数据库中,用分号 (";") 分隔。我在 Zend 上使用过并且效果很好:

where("location REGEXP '(^|[[.semicolon.]])" . $id . "([[.semicolon.]]|$)'");

我使用 MeekroDB 类在 Slim 框架上编程。我当前的 php 代码:

$DB = new DB(); //MeekroDB PHP Class
$data = $DB::query("SELECT * FROM items WHERE locations REGEXP '(^|[[.semicolon.]])%s([[.semicolon.]]|$)'" , $id);

$id 是整数。我得到错误:

QUERY: SELECT * FROM items WHERE location REGEXP '(^|[[.semicolon.]])'1'([[.semicolon.]]|$)' 错误:你有一个错误 在您的 SQL 语法中;检查与您的 MariaDB 对应的手册 服务器版本,以便在附近使用正确的语法 '1'([[.semicolon.]]|$)'' 在第 1 行

知道有什么问题吗?

【问题讨论】:

【参考方案1】:
mysql> SELECT FIND_IN_SET('87', REPLACE('6;27;18;87', ';', ','));
+----------------------------------------------------+
| FIND_IN_SET('87', REPLACE('6;27;18;87', ';', ',')) |
+----------------------------------------------------+
|                                                  4 |
+----------------------------------------------------+
1 row in set (0.00 sec)

也就是说,

    将分号改为逗号 FIND_IN_SET()搜索 测试 0 以查看它是否存在。 0=假,>0 = 真。

您的代码将类似于

DB::query("SELECT * FROM items
           WHERE FIND_IN_SET(%s, REPLACE(locations, ';', ','))",
      $id);

【讨论】:

【参考方案2】:

MariaDB 5.5.x 没有 [[.semicolon.]],请改用普通分号:

SELECT * FROM items WHERE location REGEXP '(^|;)8(;|$)'

http://sqlfiddle.com/#!9/0c5cb/1

在 MariaDB 10.0.5 之前,使用的符合 POSIX 1003.2 的正则表达式库没有 [[.semicolon.]]。从 MariaDB 10.0.5 开始,使用支持 [[.semicolon.]] 的 PCRE 库。 https://mariadb.com/kb/en/mariadb/regular-expressions-overview/

【讨论】:

谢谢朱利安!这就是我要找的。它正在工作: $data = $DB::query("SELECT * FROM items WHERE locations REGEXP '(^|;)%d(;|$)'" , $id);

以上是关于如何使用分号分隔符从 MariaDB 获取数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在docker上远程访问mariadb?

用Python读取分号(';')分隔的原始文本

如何在熊猫中读取带有分号分隔符的文件

读取分号分隔的csv

如何使用 OPENROWSET 导出以分号分隔的数据?

如何在 Azure 数据工厂中正确展平分号数组?