wpdb::check_safe_collation( string $query ): bool

In this article

Checks if the query is accessing a collation considered safe on the current version of MySQL.

Parameters

$querystringrequired
The query to check.

Return

bool True if the collation is safe, false if it isn’t.

Source

protected function check_safe_collation( $query ) {
	if ( $this->checking_collation ) {
		return true;
	}

	// We don't need to check the collation for queries that don't read data.
	$query = ltrim( $query, "\r\n\t (" );
	if ( preg_match( '/^(?:SHOW|DESCRIBE|DESC|EXPLAIN|CREATE)\s/i', $query ) ) {
		return true;
	}

	// All-ASCII queries don't need extra checking.
	if ( $this->check_ascii( $query ) ) {
		return true;
	}

	$table = $this->get_table_from_query( $query );
	if ( ! $table ) {
		return false;
	}

	$this->checking_collation = true;
	$collation                = $this->get_table_charset( $table );
	$this->checking_collation = false;

	// Tables with no collation, or latin1 only, don't need extra checking.
	if ( false === $collation || 'latin1' === $collation ) {
		return true;
	}

	$table = strtolower( $table );
	if ( empty( $this->col_meta[ $table ] ) ) {
		return false;
	}

	// If any of the columns don't have one of these collations, it needs more confidence checking.
	$safe_collations = array(
		'utf8_bin',
		'utf8_general_ci',
		'utf8mb3_bin',
		'utf8mb3_general_ci',
		'utf8mb4_bin',
		'utf8mb4_general_ci',
	);

	foreach ( $this->col_meta[ $table ] as $col ) {
		if ( empty( $col->Collation ) ) {
			continue;
		}

		if ( ! in_array( $col->Collation, $safe_collations, true ) ) {
			return false;
		}
	}

	return true;
}

Changelog

VersionDescription
4.2.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.