【问题标题】:Regular Expression to parse SQL Structure用于解析 SQL 结构的正则表达式
【发布时间】:2011-02-24 10:01:39
【问题描述】:

我正在尝试解析“DESCRIBE [TABLE]”返回的 MySQL 数据类型。

它返回如下字符串:

int(11)
浮动
varchar(200)
int(11) 无符号
float(6,2)

我尝试使用正则表达式来完成这项工作,但它不起作用。

PHP 代码:

$string = "int(11) numeric";<br/>
$regex = '/(\w+)\s*(\w+)/';<br/>
var_dump( preg_split($regex, $string) );<br/>

【问题讨论】:

  • 为什么需要为此使用正则表达式?解析输出后,您最终希望得到什么?
  • 如何解析呢?你希望最终的结果是什么?括号的内容?

标签: php mysql regex types


【解决方案1】:

查询information schema 以进行表和列的自省等。

【讨论】:

    【解决方案2】:

    我在Zend_Db_Adapter_Mysqli::describeTable() 中编写了执行此操作的代码。
    它处理 varchar、char、decimal、float 和所有 MySQL 整数类型。

    由于 StackOverflow 的 CC-wiki 许可政策,我不会在此处发布代码,但请前往该链接查看。

    mysql_fetch_field() 只报告查询结果集的数据类型,不报告持久化表。

    INFORMATION_SCHEMA 是另一种选择,但 MySQL 早期实现它的性能非常差,这使得它很难在需要快速响应时间的 Web 应用程序中使用。 MySQL 5.1.23 中的一些更改试图提高性能,但仍然有人报告问题。

    【讨论】:

    • 纯粹出于好奇,CC-wiki 真的与 BSD 许可证有重大冲突吗?
    • SO 使用的 CC Share-Alike 许可证需要署名,并且它还要求任何源自 CC 许可代码的作品也必须使用类似的许可证。本身不是冲突,但它混淆了使用条款。
    • 这正是我想要的。我已经测试过了,效果很好! :)
    【解决方案3】:

    为什么不直接从directly 字段中提取元数据?

    ...
    $meta = mysql_fetch_field($result, $i);
    echo $meta->type;
    echo $meta->max_length;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2011-07-20
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多