php - text長度不夠用,改mediumtext感覺太大,有沒什麼方法?
某草草
某草草 2017-05-16 13:07:57
0
3
537

新手問題,見笑了。

我想讓每篇文章都有一個獨立的訪問統計,訪問統計資訊單獨一個欄位。

1條存取資料約為450個字元。幾乎都是英文數字,只有ip位址是中文。

text長度是65535,相當約145條。感覺 太少了。
如果改為mediumtext感覺太大,用不完,佔用空間。

請教有沒什麼方法?

某草草
某草草

全部回覆(3)
大家讲道理

楼主先要搞清楚,text和longtext这些都是可变长度的字段类型.
这是phpMyAdmin里的说明:
text: 最多存储65535(2^16-1)字节的文本字段,存储时在内容前使用2字节表示内容的字节数.
longtext: 最多存储4294967295字节即4GB(2^32-1)的文本字段,存储时在内容前使用4字节表示内容的字节数.
也就是说,你在longtext类型的字段里只存1个字符,占用空间只不过是4个字节加上1个字符占用的字节数,而不是占用4个GB的存储空间,4个GB指的是该字段能容纳的最大值.

最后就是有明显关系并且需要查询统计的多个量,不建议全部塞到一个字段里面.像不确定的会话数据(如JSON串)这类东西,倒是可以一股脑存到一个longtext字段.比如我的会话表:

DROP TABLE IF EXISTS `io_session`;
CREATE TABLE IF NOT EXISTS `io_session` (
    `user_id` bigint unsigned NOT NULL COMMENT '用户编号',
    `data` longtext NOT NULL COMMENT '会话内容',
    `create_time` bigint unsigned NOT NULL COMMENT '创建时间',
    `update_time` bigint unsigned NOT NULL COMMENT '更新时间',
    `version` smallint unsigned NOT NULL DEFAULT '0' COMMENT '版本号',
    `flag` tinyint NOT NULL DEFAULT '1' COMMENT '版本号递增递减方向标识',
    PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='会话表';

// 填出会话数据到数组 $io['user']['session']
function io_session_get() {
    global $io;
    if(!isset($io['user']['id'])) return false;
    $db = io_db();
    $table = IO_DB_PREFIX.'session';
    $sql = "SELECT * FROM `{$table}` WHERE `user_id` = ?";
    $stmt = $db->prepare($sql); $stmt->execute(array($io['user']['id']));
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    if(!isset($rows[0])) return false;
    $data = json_decode($rows[0]['data'], true);
    // JSON解码失败时,把会话内容重置为空
    $io['user']['session']['data']    = ($data) ? $data : array();
    $io['user']['session']['version'] = $rows[0]['version'];
    $io['user']['session']['flag']    = $rows[0]['flag'];
    //register_shutdown_function('io_session_set');
}

// 将会话数据写入到数据库
function io_session_set() {
    global $io;
    if(!isset($io['user']['session'])) return false;
    $data = json_encode($io['user']['session']['data']);
    $db = io_db();
    $table = IO_DB_PREFIX.'session';
    switch(true) {
        // version 类型 smallint 范围 0 到 65535
        case ($io['user']['session']['flag'] == 1 && $io['user']['session']['version'] != 65535): {
            $sql = "UPDATE `{$table}` SET `data` = ?, `version` = ? 
            WHERE `user_id` = ? AND `version` = ? AND `flag` = 1";
            $version_increase = true;
            break;
        }
        case ($io['user']['session']['flag'] == 1 && $io['user']['session']['version'] == 65535): {
            $sql = "UPDATE `{$table}` SET `data` = ?, `version` = ?, `flag` = -1 
            WHERE `user_id` = ? AND `version` = ? AND `flag` = 1";
            $version_increase = false;
            break;
        }
        case ($io['user']['session']['flag'] == -1 && $io['user']['session']['version'] != 0): {
            $sql = "UPDATE `{$table}` SET `data` = ?, `version` = ? 
            WHERE `user_id` = ? AND `version` = ? AND `flag` = -1";
            $version_increase = false;
            break;
        }
        case ($io['user']['session']['flag'] == -1 && $io['user']['session']['version'] == 0): {
            $sql = "UPDATE `{$table}` SET `data` = ?, `version` = ?, `flag` = 1 
            WHERE `user_id` = ? AND `version` = ? AND `flag` = -1";
            $version_increase = true;
            break;
        }
    }
    $stmt = $db->prepare($sql);
    $stmt->execute(array(
        $data,
        $version_increase ? $io['user']['session']['version'] + 1 : $io['user']['session']['version'] - 1,
        $io['user']['id'],
        $io['user']['session']['version'],
    ));
    return ($stmt->rowCount() == 0) ? false : true;
}

io_session_get();
var_export($io['user']['session']);
$io['user']['session']['data']['date'] = date('Y-m-d H:i:s');
io_session_set();
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!