函数文档

maybe_convert_table_to_utf8mb4()

💡 云策文档标注

概述

maybe_convert_table_to_utf8mb4() 是一个 WordPress 函数,用于检查数据库表是否仅包含 utf8 或 utf8mb4 字符集的列,如果是,则将其转换为 utf8mb4 字符集。该函数返回布尔值表示转换是否成功。

关键要点

  • 函数参数:接受一个字符串参数 $table,指定要转换的表名。
  • 返回值:返回 true 表示表已转换,false 表示未转换(例如表包含非 utf8/utf8mb4 列或操作失败)。
  • 功能逻辑:首先检查表中所有列的字符集,如果存在非 utf8 或 utf8mb4 的列,则中止并返回 false;然后检查表的当前字符集,如果已是 utf8mb4,则返回 true;否则执行 ALTER TABLE 语句进行转换。
  • 依赖函数:使用 $wpdb->get_results() 获取列信息,$wpdb->get_row() 获取表状态,$wpdb->query() 执行转换查询。

代码示例

function maybe_convert_table_to_utf8mb4( $table ) {
    global $wpdb;

    $results = $wpdb->get_results( "SHOW FULL COLUMNS FROM `$table`" );
    if ( ! $results ) {
        return false;
    }

    foreach ( $results as $column ) {
        if ( $column->Collation ) {
            list( $charset ) = explode( '_', $column->Collation );
            $charset         = strtolower( $charset );
            if ( 'utf8' !== $charset && 'utf8mb4' !== $charset ) {
                // Don't upgrade tables that have non-utf8 columns.
                return false;
            }
        }
    }

    $table_details = $wpdb->get_row( "SHOW TABLE STATUS LIKE '$table'" );
    if ( ! $table_details ) {
        return false;
    }

    list( $table_charset ) = explode( '_', $table_details->Collation );
    $table_charset         = strtolower( $table_charset );
    if ( 'utf8mb4' === $table_charset ) {
        return true;
    }

    return $wpdb->query( "ALTER TABLE $table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" );
}

注意事项

  • 该函数在 WordPress 4.2.0 版本中引入,主要用于数据库升级过程(如 pre_schema_upgrade() 和 upgrade_network())。
  • 转换操作可能影响数据库性能,建议在维护模式下或低流量时执行。
  • 确保表名正确且数据库连接正常,否则可能返回 false。

📄 原文内容

If a table only contains utf8 or utf8mb4 columns, convert it to utf8mb4.

Parameters

$tablestringrequired
The table to convert.

Return

bool True if the table was converted, false if it wasn’t.

Source

function maybe_convert_table_to_utf8mb4( $table ) {
	global $wpdb;

	$results = $wpdb->get_results( "SHOW FULL COLUMNS FROM `$table`" );
	if ( ! $results ) {
		return false;
	}

	foreach ( $results as $column ) {
		if ( $column->Collation ) {
			list( $charset ) = explode( '_', $column->Collation );
			$charset         = strtolower( $charset );
			if ( 'utf8' !== $charset && 'utf8mb4' !== $charset ) {
				// Don't upgrade tables that have non-utf8 columns.
				return false;
			}
		}
	}

	$table_details = $wpdb->get_row( "SHOW TABLE STATUS LIKE '$table'" );
	if ( ! $table_details ) {
		return false;
	}

	list( $table_charset ) = explode( '_', $table_details->Collation );
	$table_charset         = strtolower( $table_charset );
	if ( 'utf8mb4' === $table_charset ) {
		return true;
	}

	return $wpdb->query( "ALTER TABLE $table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci" );
}

Changelog

Version Description
4.2.0 Introduced.