1 charset_converter.inc | public DatabaseCharsetConverter::convertTableFields($table_name, $charset = NULL, $collation = NULL) |
Converts a table's field to a desired character set and collation.
Parameters
string $table_name: The table name to convert. This should be the actual table name in the database, with any table prefix already prepended.
string|null $charset: (Optional) The character set. Defaults to the constructor value.
string|null $collation: (Optional) The collation. Defaults to the constructor value.
Return value
bool: TRUE if the table fields are converted successfully, FALSE on failure.
Throws
PDOException
File
- core/
includes/ database/ charset_converter.inc, line 211
Class
- DatabaseCharsetConverter
- Character set converter for database tables.
Code
public function convertTableFields($table_name, $charset = NULL, $collation = NULL) {
$return = TRUE;
$results = $this->connection->query("SHOW FULL FIELDS FROM `$table_name`")->fetchAllAssoc('Field');
$charset = $charset ? : $this->charset;
$collation = $collation ? : $this->collation;
foreach ($results as $row) {
// Skip fields that don't have collation, as they are probably int or
// similar. If we are using that collation for this field already save a
// query or is not binary.
if (!$row->Collation || $row->Collation === $collation || strpos($row->Collation, '_bin') !== FALSE) {
continue;
}
$default = '';
if ($row->Default !== NULL) {
$default = 'DEFAULT ' . ($row->Default == "CURRENT_TIMESTAMP" ? "CURRENT_TIMESTAMP" : ":default");
}
elseif ($row->Null == 'YES' && $row->Key == '') {
if ($row->Type == 'timestamp') {
$default = 'NULL ';
}
$default .= 'DEFAULT NULL';
}
$sql = "ALTER TABLE `$table_name`
MODIFY `" . $row->Field . "` " .
$row->Type . " " . // phpcs:ignore -- Separate concat string for clarity.
"CHARACTER SET :charset COLLATE :collation " .
($row->Null == "YES" ? "" : "NOT NULL ") .
$default . " " .
$row->Extra . " " . // phpcs:ignore -- Separate concat string for clarity.
"COMMENT :comment";
$params = array(
':charset' => $charset,
':collation' => $collation,
':comment' => $row->Comment,
);
if (strstr($default, ':default')) {
$params[':default'] = $row->Default;
}
$result = $this->connection->query($sql, $params);
if (!$result) {
$return = FALSE;
}
}
return $return;
}