选择最大数据长度为MySQL的列名

时间:2014-09-10 04:20:11

标签: mysql sql

我在mysql中有一个包含很多列的表,我希望看到最大值的长度。我的目的是我知道插入时有些数据被截断,我想增加varchar长度。但不知道,列什么。 (解释有点凌乱,但可能sql会有意义)

我试过了:

 select COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, DATA_TYPE, (SELECT LENGTH(COLUMN_NAME) as maxlen FROM my_database.my_table ORDER BY  maxlen DESC LIMIT 1)
from information_schema.columns
where table_schema = 'my_database' AND
      table_name = 'my_table'AND DATA_TYPE = 'varchar' 

它可以工作,但返回列的长度,但不返回其中的数据。 (即我的id列被称为id,我得到了2)。

如果我使用JOIN(ON TRUE条件),我收到COLUMN_NAME未定义的错误。

存储过程不允许数据返回,并且函数不允许在其中包含动态sql。

如何告诉MySQL(如果我的查询)将COLUMN_NAME视为字符串,而不是列名?如果不是这样,可以选择,如何获取其中包含最大数据的列?

所需结果如下:

column_1     |     25      |   varchar    | 20
column_2     |     25      |   varchar    | 7

我只对varchar感兴趣,因为int调整没有意义(并且不需要)。列的长度不同(varchar(20)varchar(25)等。)

更新1:这也不能通过循环完成(语句不能在游标内执行)。

1 个答案:

答案 0 :(得分:1)

我使用这种类型的代码来使用表模式自动生成我的视图。使用可以根据您的需要进行修改。

   $sql = "show tables from DBName where Tables_in_yourtbalename = 'yourtbalename' ";
         $result = executeQuery($sql, $conn);
         $num = $result->num_rows;

    if ($num) {
        $sql = "show columns from yourtbalename where Extra != 'auto_increment'";
        $result = executeQuery($sql, $conn);
        $num2 = $result->num_rows;

        while ($r = $result->fetch_assoc()) {
            if ($r['Key'] == 'MUL' && ( preg_match("/^int/", $r['Type']) || preg_match("/^smallint/", $r['Type']) || preg_match("/^tinyint/", $r['Type']) || preg_match("/^bigint/", $r['Type']))) {

            } else if ($r['Field'] == 'status') {

            }
    }   

$ r [' Field']是字段名称,$ r [' Type']提供其类型。用于确定maxlength使用

  $maxlength="' . substr(str_replace(")", "", $r['Type']), 8, (strlen(str_replace(")", "",     $r['Type']))));