如何在MySQL数据库中获取枚举值?

Sha*_*oon 93 php mysql

我想自动使用DB中的枚举可能值来填充我的下拉列表.这在MySQL中可行吗?

Pat*_*lle 94

我有一个codeigniter版本给你.它还会从值中删除引号.

function get_enum_values( $table, $field )
{
    $type = $this->db->query( "SHOW COLUMNS FROM {$table} WHERE Field = '{$field}'" )->row( 0 )->Type;
    preg_match("/^enum\(\'(.*)\'\)$/", $type, $matches);
    $enum = explode("','", $matches[1]);
    return $enum;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果枚举值本身包含逗号,则此解决方案将中断. (26认同)
  • 此解决方案适用于codeigniter https://github.com/thiswolf/codeigniter-enum-select-boxes (3认同)
  • PHP版本:$ type = $ this-> mysql-> select("SHOW COLUMNS FROM $ table WHERE Field ='$ field'")[0] ["Type"]; (3认同)
  • 我添加了[答案](/sf/answers/3237372001/),并提供了完整的证明方法来提取所有枚举值,无论其中的字符如何。 (2认同)

Mat*_*hew 50

您可以通过这样查询来获取值:

SELECT SUBSTRING(COLUMN_TYPE,5)
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA='databasename' 
    AND TABLE_NAME='tablename'
    AND COLUMN_NAME='columnname'
Run Code Online (Sandbox Code Playgroud)

从那里你需要将其转换为数组:

  • 如果你很懒,直接进入数组的eval(尽管MySQL的单引号转义可能不兼容),或者
  • $ options_array = str_getcsv($ options,',',"'")可能会起作用(如果你改变子字符串以跳过开括号和右括号),或者
  • 一个正则表达式


jas*_*bar 29

MySQL参考

如果要确定ENUM列的所有可能值,请使用SHOW COLUMNS FROM tbl_name LIKE enum_col并解析输出的Type列中的ENUM定义.

你会想要这样的东西:

$sql = "SHOW COLUMNS FROM `table` LIKE 'column'";
$result = $db->query($sql);
$row = $result->fetchRow();
$type = $row['Type'];
preg_match('/enum\((.*)\)$/', $type, $matches);
$vals = explode(',', $matches[1]);
Run Code Online (Sandbox Code Playgroud)

这将为您提供引用的值.MySQL总是将这些用单引号括起来.值中的单个引号通过单引号进行转义.您可以安全地调用trim($val, "'")每个数组元素.你想要转换''成只是'.

以下将返回没有引号的$ trimmedvals数组项:

$trimmedvals = array();
foreach($vals as $key => $value) {
$value=trim($value, "'");
$trimmedvals[] = $value;
}
Run Code Online (Sandbox Code Playgroud)


小智 11

这就像上面的很多,但是给你的结果没有循环,并且你想要你真正想要的东西:一个简单的数组,用于生成选择选项.

奖励:它适用于SET以及ENUM字段类型.

$result = $db->query("SHOW COLUMNS FROM table LIKE 'column'");
if ($result) {
    $option_array = explode("','",preg_replace("/(enum|set)\('(.+?)'\)/","\\2", $result[0]->Type));
}
Run Code Online (Sandbox Code Playgroud)

$ option_array:Array([0] => red [1] => green [2] => blue)


egg*_*yal 10

这是Chris Komlenic 为什么MySQL的ENUM数据类型是邪恶8个原因之一:

 获取不同的ENUM成员列表是一件痛苦的事.

一个非常常见的需求是使用数据库中的可能值填充选择框或下拉列表.像这样:

选择颜色:

[ select box ]

如果这些值存储在名为"colors"的引用表中,您只需要:SELECT * FROM colors...然后可以解析它以动态生成下拉列表.您可以在参考表中添加或更改颜色,您的性感订单将自动更新.真棒.

现在考虑邪恶的ENUM:你如何提取成员列表?您可以在表中查询ENUM列中的DISTINCT值,但这只会返回实际使用并显示在表中的值,而不一定是所有可能的值.您可以使用脚本语言查询INFORMATION_SCHEMA并从查询结果中解析它们,但这不必要地复杂化.实际上,我不知道提取ENUM列的成员列表的任何优雅,纯粹的SQL方式.


bas*_*aus 9

您可以将字符串解析为CSV(逗号分隔值)字符串.PHP有一个很棒的内置函数,名为str_getcsv,它将CSV字符串转换为数组.

// This is an example to test with
$enum_or_set = "'blond','brunette','redhead'";

// Here is the parser
$options = str_getcsv($enum_or_set, ',', "'");

// Output the value
print_r($options);
Run Code Online (Sandbox Code Playgroud)

这应该给你类似于以下内容:

Array
(
    [0] => blond
    [1] => brunette
    [2] => redhead
)
Run Code Online (Sandbox Code Playgroud)

此方法还允许您在字符串中使用单引号(请注意使用两个单引号):

$enum_or_set = "'blond','brunette','red''head'";

Array
(
    [0] => blond
    [1] => brunette
    [2] => red'head
)
Run Code Online (Sandbox Code Playgroud)

有关str_getcsv函数的更多信息,请查看PHP手册:http://uk.php.net/manual/en/function.str-getcsv.php

  • `str_getcsv`仅适用于PHP 5> = 5.3.0,您可以[包含此文件](http://pear.php.net/reference/PHP_Compat-latest/__filesource/fsource_PHP_Compat__PHP_Compat-1.6.0a3CompatFunctionstr_getcsv.php.html)如果您想在早期版本中获得此功能. (2认同)

小智 6

这是一个更新的方式,这对我有用:

function enum_to_array($table, $field) {    
    $query = "SHOW FIELDS FROM `{$table}` LIKE '{$field}'";
    $result = $db->query($sql);
    $row = $result->fetchRow();
    preg_match('#^enum\((.*?)\)$#ism', $row['Type'], $matches);
    $enum = str_getcsv($matches[1], ",", "'");
    return $enum;
}
Run Code Online (Sandbox Code Playgroud)

最终,与"enum()"分开时的枚举值只是一个CSV字符串,因此解析它!


小智 5

这是为了mysqli

function get_enum_values($mysqli, $table, $field )
{
    $type = $mysqli->query("SHOW COLUMNS FROM {$table} WHERE Field = '{$field}'")->fetch_array(MYSQLI_ASSOC)['Type'];
    preg_match("/^enum\(\'(.*)\'\)$/", $type, $matches);
    $enum = explode("','", $matches[1]);
    return $enum;
}
$deltypevals = get_enum_values($mysqli, 'orders', 'deltype');
var_dump ($deltypevals);
Run Code Online (Sandbox Code Playgroud)