首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL如何找到最长的标识符名?

问MySQL如何找到最长的标识符名?
EN

Stack Overflow用户
提问于 2022-05-23 08:59:45
回答 2查看 47关注 0票数 0

如何在MySQL数据库中找到最长的标识符名?除了在脚本语言ala foreach("SHOW TABLES" as table){SHOW COLUMNS FROM TABLE}中循环标识符之外,我还没有找到找到它的任何SQL方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-23 09:56:44

简单地回答这个问题

MySQL如何找到最长的标识符名?

使用information_schema.COLUMNS。下面的查询查找所有模式中最长的标识符,可以通过添加以下条件AND TABLE_SCHEMA='your_database'来重新配置

代码语言:javascript
复制
SELECT COLUMN_NAME,TABLE_SCHEMA,TABLE_NAME,LENGTH(COLUMN_NAME)
FROM information_schema.COLUMNS 
WHERE LENGTH(COLUMN_NAME) in (SELECT MAX(LENGTH(COLUMN_NAME)) as max_column_name FROM  information_schema.COLUMNS );

经测试:

代码语言:javascript
复制
mysql> SELECT COLUMN_NAME,TABLE_SCHEMA,TABLE_NAME,LENGTH(COLUMN_NAME)
    -> FROM information_schema.COLUMNS
    -> WHERE LENGTH(COLUMN_NAME) in (SELECT MAX(LENGTH(COLUMN_NAME)) as max_column_name FROM  information_schema.COLUMNS );
+---------------------------------------------------------+--------------------+--------------------------------------+---------------------+
| COLUMN_NAME                                             | TABLE_SCHEMA       | TABLE_NAME                           | LENGTH(COLUMN_NAME) |
+---------------------------------------------------------+--------------------+--------------------------------------+---------------------+
| LAST_APPLIED_TRANSACTION_LAST_TRANSIENT_ERROR_TIMESTAMP | performance_schema | replication_applier_status_by_worker |                  55 |
+---------------------------------------------------------+--------------------+--------------------------------------+---------------------+
1 row in set (0.05 sec)
票数 1
EN

Stack Overflow用户

发布于 2022-05-23 09:15:26

我希望有人有一个更好的解决方案,但这里有一个PHP循环实现,打印

代码语言:javascript
复制
$ php longest_identifier_names.php
string(31) "blocket_external_targetbookings"
string(32) "is_available_for_all_subscribers"
string(64) "blocket_external_targetbookings.is_available_for_all_subscribers"

代码:

代码语言:javascript
复制
<?php

declare(strict_types=1);

/**
 * quote identifiers like column names, table names, aliases
 * warning: does not support identifiers with dots in the name, like
 * `ads.productid` will be interpreted as
 * `ads`.`productid` (table ads, column productid), not `ads.productid`
 *
 * @param string $identifier
 * @return string
 * @throws \LengthException if identifier is too long
 */
function quoteIdentifier(string $identifier): string
{
    // identifiers have different escaping rules than other strings
    // https://www.codetinkerer.com/2015/07/08/escaping-column-and-table-names-in-mysql-part2.html
    $ret = '`' . strtr($identifier, array(
        '`' => '``',
        '.' => '`.`'
    )) . '`';
    if(strlen($ret) > 66){
        // MySQL does weird/scary things when identifiers are too long,
        // protect against possible "SQL Truncation Vulnerability" attacks..
        throw new \LengthException('Identifier too long: ' . $identifier); 
    }
    return $ret;
}

$host = 'mysql.foo.com';
$db = 'dbname';
$user = 'username';
$pass = 'password';
$db = new \PDO("mysql:host={$host};dbname={$db};charset=utf8mb4", $user, $pass, array(
    \PDO::ATTR_EMULATE_PREPARES => false,
    \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION,
    \PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
));

$longest_table = "";
// @var string[] $tables
$tables = [];
foreach($db->query("SHOW TABLES", PDO::FETCH_NUM) as $row) {
    $table = $row[0];
    if(strlen($table) > strlen($longest_table)) {
        $longest_table = $table;
    }
    $tables[] = $row[0];
}
$longest_field = "";
foreach($tables as $table) {
    foreach($db->query("SHOW COLUMNS FROM ". quoteIdentifier($table), PDO::FETCH_ASSOC) as $row) {
        $field = $row['Field'];
        if(strlen($field) > strlen($longest_field)) {
            $longest_field = $field;
        }
    }
}
var_dump($longest_table, $longest_field, "{$longest_table}.{$longest_field}");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72345836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档