maybe_convert_table_to_utf8mb4()WP 4.2.0

Конвертирует поля таблицы в кодировку utf8mb4_unicode_ci, если в таблице есть поля с кодировкой utf8_* или utf8mb4_*.

Изменит кодировку всех строковых полей таблицы на utf8mb4_unicode_ci, только в том случает, если:

  1. Таблица существует.
  2. Сравнение (Collation) всех полей равно: '' (числовые поля) или начинается с 'utf8' или 'utf8mb4' (строковые поля).
  3. Сравнение (Collation) самой таблицы не начинается с 'utf8mb4'.

В других случаях функция ничего не сделает.

Функция не определена по умолчанию, чтобы функция работала нужно подключить файл wp-admin/includes/upgrade.php.

Функцию нужно запускать единожды при активации плагина!

Хуков нет.

Возвращает

true|false. Логические: true - если удалось конвертировать и false - если нет.

Использование

maybe_convert_table_to_utf8mb4( $table );
$table(строка) (обязательный)
Название таблицы, которую нужно сконвертировать.

Примеры

0

#1 Изменим кодировку всех полей таблицы на utf8mb4

register_activation_hook( __FILE__, 'myplugin_activate' );
function myplugin_activate() {
	$table = 'my_table';

	require ABSPATH . '/wp-admin/includes/upgrade.php';
	maybe_convert_table_to_utf8mb4( $table );
}

Заметки

  • Global. wpdb. $wpdb WordPress database abstraction object.

Список изменений

С версии 4.2.0 Введена.

Код maybe_convert_table_to_utf8mb4() WP 6.6.2

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" );
}