MySQL ile utf-8-bin harmanlama için tüm tabloları ve alanları değiştirmek için bir script

9 Cevap php

Ben bir veritabanındaki tüm tablo ve alanları varsayılan harmanlama değiştirmek olacak çalıştırabilirsiniz SQL veya PHP komut dosyası var mı?

Ben bir ben yazabilirim, ama bu böyle bir sitede hazır bir şey olması gerektiğini düşünüyorum. Biri birini nakleder önce ben bir kendime gelip, ben kendim yayınlayacağız.

9 Cevap

Dikkatli olun! Aslında utf başka kodlama olarak saklanan varsa, elinizde gerçek bir karışıklık olabilir. İlk yedekleyin. Sonra standart yöntemlerden bazılarını deneyin:

for instance http://www.cesspit.net/drupal/node/898 http://www.hackszine.com/blog/archive/2007/05/mysql_database_migration_latin.html

Geri varchar / metne, sonra ikili tüm metin alanları dönüştürme başvurmak zorunda kalmıştım. Bu kıçımı kurtardı.

Ben veri latin1 olarak depolanır, UTF8 olduğu vardı. Ne yaptım:

Drop indexes. Convert fields to binary. Convert to utf8-general ci

Sizin LAMP, db ile etkileşim önce set İSİMLER komuta eklemek ve karakter kodlama başlıklarını ayarlamak emin olun unutmayın eğer.

Tek bir komutla (PHP ziyade 148) yapılabilir:

mysql --database=dbname -B -N -e "SHOW TABLES" \
| awk '{print "SET foreign_key_checks = 0; ALTER TABLE", $1, "CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; SET foreign_key_checks = 1; "}' \
| mysql --database=dbname &

You've got to love the commandline... (You might need to employ the --user and --password options for mysql).

EDIT: yabancı anahtar sorunları önlemek için, ilave SET foreign_key_checks = 0; ve SET foreign_key_checks = 1;

Tamam, ben bu thread söylenenleri dikkate alarak bu kadar yazdı. Yardım için teşekkürler, ve ben bu script başkalarına yardımcı olacağını umuyoruz. Ben onun kullanımı için herhangi bir garanti var, bu yüzden çalıştırmadan önce YEDEKLE'yi LÜTFEN yok. Bu should tüm veritabanları ile çalışmak; ve bu benim kendi büyük çalıştı.

EDIT: Added vars at the top for which charset/collate to convert to. EDIT2: Changes the database's and tables' default charset/collate

<?php

function MysqlError()
{
	if (mysql_errno())
	{
		echo "<b>Mysql Error: " . mysql_error() . "</b>\n";
	}
}

$username = "root";
$password = "";
$db = "database";
$host = "localhost";

$target_charset = "utf8";
$target_collate = "utf8_general_ci";

echo "<pre>";

$conn = mysql_connect($host, $username, $password);
mysql_select_db($db, $conn);

$tabs = array();
$res = mysql_query("SHOW TABLES");
MysqlError();
while (($row = mysql_fetch_row($res)) != null)
{
	$tabs[] = $row[0];
}

// now, fix tables
foreach ($tabs as $tab)
{
	$res = mysql_query("show index from {$tab}");
	MysqlError();
	$indicies = array();

	while (($row = mysql_fetch_array($res)) != null)
	{
		if ($row[2] != "PRIMARY")
		{
			$indicies[] = array("name" => $row[2], "unique" => !($row[1] == "1"), "col" => $row[4]);
			mysql_query("ALTER TABLE {$tab} DROP INDEX {$row[2]}");
			MysqlError();
			echo "Dropped index {$row[2]}. Unique: {$row[1]}\n";
		}
	}

	$res = mysql_query("DESCRIBE {$tab}");
	MysqlError();
	while (($row = mysql_fetch_array($res)) != null)
	{
		$name = $row[0];
		$type = $row[1];
		$set = false;
		if (preg_match("/^varchar\((\d+)\)$/i", $type, $mat))
		{
			$size = $mat[1];
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} VARBINARY({$size})");
			MysqlError();
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} VARCHAR({$size}) CHARACTER SET {$target_charset}");
			MysqlError();
			$set = true;

			echo "Altered field {$name} on {$tab} from type {$type}\n";
		}
		else if (!strcasecmp($type, "CHAR"))
		{
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} BINARY(1)");
			MysqlError();
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} VARCHAR(1) CHARACTER SET {$target_charset}");
			MysqlError();
			$set = true;

			echo "Altered field {$name} on {$tab} from type {$type}\n";
		}
		else if (!strcasecmp($type, "TINYTEXT"))
		{
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} TINYBLOB");
			MysqlError();
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} TINYTEXT CHARACTER SET {$target_charset}");
			MysqlError();
			$set = true;

			echo "Altered field {$name} on {$tab} from type {$type}\n";
		}
		else if (!strcasecmp($type, "MEDIUMTEXT"))
		{
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} MEDIUMBLOB");
			MysqlError();
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} MEDIUMTEXT CHARACTER SET {$target_charset}");
			MysqlError();
			$set = true;

			echo "Altered field {$name} on {$tab} from type {$type}\n";
		}
		else if (!strcasecmp($type, "LONGTEXT"))
		{
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} LONGBLOB");
			MysqlError();
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} LONGTEXT CHARACTER SET {$target_charset}");
			MysqlError();
			$set = true;

			echo "Altered field {$name} on {$tab} from type {$type}\n";
		}
		else if (!strcasecmp($type, "TEXT"))
		{
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} BLOB");
			MysqlError();
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} TEXT CHARACTER SET {$target_charset}");
			MysqlError();
			$set = true;

			echo "Altered field {$name} on {$tab} from type {$type}\n";
		}

		if ($set)
			mysql_query("ALTER TABLE {$tab} MODIFY {$name} COLLATE {$target_collate}");
	}

	// re-build indicies..
	foreach ($indicies as $index)
	{
		if ($index["unique"])
		{
			mysql_query("CREATE UNIQUE INDEX {$index["name"]} ON {$tab} ({$index["col"]})");
			MysqlError();
		}
		else
		{
			mysql_query("CREATE INDEX {$index["name"]} ON {$tab} ({$index["col"]})");
			MysqlError();
		}

		echo "Created index {$index["name"]} on {$tab}. Unique: {$index["unique"]}\n";
	}

	// set default collate
	mysql_query("ALTER TABLE {$tab}  DEFAULT CHARACTER SET {$target_charset} COLLATE {$target_collate}");
}

// set database charset
mysql_query("ALTER DATABASE {$db} DEFAULT CHARACTER SET {$target_charset} COLLATE {$target_collate}");

mysql_close($conn);
echo "</pre>";

>

Bu PHP pasajı bir db tüm tablolarda harmanlamayı değişecektir. (Bu this site den almış.)

<?php
// your connection
mysql_connect("localhost","root","***");
mysql_select_db("db1");

// convert code
$res = mysql_query("SHOW TABLES");
while ($row = mysql_fetch_array($res))
{
    foreach ($row as $key => $table)
    {
        mysql_query("ALTER TABLE " . $table . " CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci");
        echo $key . " =&gt; " . $table . " CONVERTED<br />";
    }
}
?>

Yukarıdaki script daha tam sürüm burada bulunabilir:

http://www.zen-cart.com/index.php?main_page=product_contrib_info&products_id=1937

Burada bu katkı hakkında herhangi bir geribildirim bırakın lütfen: http://www.zen-cart.com/forum/showthread.php?p=1034214

Charset ve harmanlama aynı şey değildir. Bir harmanlama dizeleri sıralamak konusunda kurallar kümesidir. Bir charset karakterleri temsil etmek için nasıl kurallar kümesidir. Bir harmanlama charset bağlıdır.

({[) (0]}) ile convertation için seçilen tüm tablolar, ama bir tablo dönüştürmeden önce tablo harmanlama kontrol etmek için daha uygun ve taşınabilir bir şekilde yukarıdaki komut içinde. Bu sorgu yapar:

SELECT table_name
     , table_collation 
FROM information_schema.tables

Dayalı komut satırını kullanarak bir başka yaklaşım, @ david awk ezelî

for t in $(mysql --user=root --password=admin  --database=DBNAME -e "show tables";);do echo "Altering" $t;mysql --user=root --password=admin --database=DBNAME -e "ALTER TABLE $t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;";done

prettified

  for t in $(mysql --user=root --password=admin  --database=DBNAME -e "show tables";);
    do 
       echo "Altering" $t;
       mysql --user=root --password=admin --database=DBNAME -e "ALTER TABLE $t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;";
    done

: Benim özel kabuk collatedb, bu çalışması gerekir kullanın

collatedb <username> <password> <database> <collation>

Örnek:

collatedb root 0000 myDatabase utf8_bin