[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Cмена кодировки в бд
vital
Cмена кодировки в бд.
Напомню, что. всегда перед началом работы с базой стоит делать set names 'utf8'.

Если уже поздно, и бд создана черт знает как, то можно использовать что-то такое:
<?php
$db = mysqli_connect('localhost','username','password', 'db');
if(mysqli_connect_errno())
{
echo "Cannot connect to the database - incorrect details";
}

$sql = 'SHOW TABLES';
if ( !( $result = $db->query( $sql ) ) ) {
echo '<span style="color: red;">Get SHOW TABLE - SQL Error: <br>' . "</span>\n";
}


while ( $tables = $result->fetch_row() ) {
echo $tables[0];
# Loop through all tables in this database
$table = $tables[key($tables)];

if ( !( $result2 = $db->query("ALTER TABLE ".$table." COLLATE utf8_general_ci") ) ) {
echo '<span style="color: red;">UTF SET - SQL Error: <br>' . "</span>\n";

break;
}

print "$table changed to UTF-8 successfully.<br>\n";

# Now loop through all the fields within this table
if ( !($result2 = $db->query("SHOW COLUMNS FROM ".$table) ) ) {
echo '<span style="color: red;">Get Table Columns Query - SQL Error: <br>' . "</span>\n";

break;
}


while ( $column = $result2->fetch_assoc() )
{
$field_name = $column['Field'];
$field_type = $column['Type'];

# Change text based fields
$skipped_field_types = array('char', 'text', 'enum', 'set');

foreach ( $skipped_field_types as $type )
{
if ( strpos($field_type, $type) !== false )
{
$sql4 = "ALTER TABLE $table CHANGE `$field_name` `$field_name` $field_type CHARACTER SET utf8 COLLATE utf8_general_ci";
$result4 = $db->query($sql4);

echo "---- $field_name changed to UTF-8 successfully.<br>\n";
}
}
}

echo "<hr>\n";
}
$result->free();
$result2->free();
$result4->free();
?>


Это будет без проблем работать, если у нас данные в той же кодировке, что и кодировка бд, просто мы хотим ее сменить.

Но возможна ситуация, когда бд в одной кодировке, а данные в ней- в другой. Тогда что бы это исправить, нужно сделать немного подругому последний запрос, вместо ALTER TABLE.. сделать 2 запроса, примерно так:
ALTER TABLE tbl CHANGE f1 f1 BLOB; 
ALTER TABLE tb lCHANGE f1 f1 TEXT CHARACTER SET 'utf8';



как-то так.

_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.