如何使用分号分隔符从 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 获取数据?的主要内容,如果未能解决你的问题,请参考以下文章