我在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:这也不能通过循环来完成(语句不能在游标内执行)。

最佳答案

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

   $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="' . substr(str_replace(")", "", $r['Type']), 8, (strlen(str_replace(")", "",     $r['Type']))));

07-28 02:47