【问题标题】:How get data from MariaDB using semicolon delimiter?如何使用分号分隔符从 MariaDB 获取数据?
【发布时间】: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 行

知道有什么问题吗?

【问题讨论】:

    标签: php regex mariadb delimiter


    【解决方案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)
    

    也就是说,

    1. 将分号改为逗号
    2. FIND_IN_SET()搜索
    3. 测试 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);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多