我在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']))));