www.turkiyespot.com web sayfası kontrol panelleleri yardımlaşma forumları Forum Ana Sayfa www.turkiyespot.com web sayfası kontrol panelleleri yardımlaşma forumları
ucuz hosting domain kontrol panelleri yardımlaşma forumları
 
 SSSSSS   AramaArama   Üye ListesiÜye Listesi   Kullanıcı GruplarıKullanıcı Grupları   KayıtKayıt 
 ProfilProfil   Özel mesajlarınızı kontrol etmek için giriş yapınÖzel mesajlarınızı kontrol etmek için giriş yapın   GirişGiriş 

mysql karekter setini komple değiştirmek

 
Yeni başlık gönder   Başlığa cevap gönder    www.turkiyespot.com web sayfası kontrol panelleleri yardımlaşma forumları Forum Ana Sayfa -> PHP SCRİPTLER
Önceki başlık :: Sonraki başlık  
Yazar Mesaj
turkiyespot
Site Admin


Kayıt: 11 Ksm 2005
Mesajlar: 320
Konum: istanbul

MesajTarih: Cmt Şub 07, 2009 9:54 pm    Mesaj konusu: mysql karekter setini komple değiştirmek Alıntıyla Cevap Gönder

MySQL veri tabanı kullanıyorsanız karakter seti tanımlamaları yüzünden zaman zaman sıkıntılı anlar yaşamışsınızdır. Aşağıdaki betik sayesinde bu tür sorunlarınızın ufak bir bölümüne çözüm sağlayabilirsiniz. Betiğin yaptığı iş tanımlanan karakter setini tüm tablolara ve tablo içinde alanlara uygulamaktan ibarettir. Performansını test etmesemde, üçyüzden fazla tablonun ve sayısı birkaç bini geçen tablo alanlarının tamamının karakter setinin değiştirilmesi 15-20 saniye civarında sürmüştür.

Örnek1: Kullanmakta olduğunuz tablolarınız utf8 ve tablolarınızın içindeki alanlar utf8_general_ci olarak tanımlanmış olsun. Bu durumda MySQL u ve ü harflerinde sorun çıkaracaktır. Bu sorunu gidermek tüm tabloarı ve tablolardaki alanları utf8_turkish_ci karakter setine geçirmeniz gerekecek. Bu durumda bu betiği kullanabilirsiniz.

Örnek 2: Hazır bir yazılım(wordpress, openads vs.) kurdunuz. Ancak MySQL sunucusunun ön tanımlı karakter seti latin1 olduğu için tüm tablolar ve tablo alanları latin1 karakter setinde tanımlanmış oldu. Yazılımı kullanmaya başlamadan önce istediğiniz karakter setiyle(mesela utf8 yada latin5) çalışabilecek hale getirebilirsiniz.(Tabi yazılımın desteklediğini varsayıyorum).

Örnek 3: Hazır bir yazılım kurdunuz, bir süre kullandınız ve veri girdiniz. Ardından karakter setini değiştirmek istediniz, mesela latin5den utf8e geçmek istediniz. Bu betiği kullanırsanız tüm tablolarınız ve tablolarınızın içindeki alanlar istediğiniz karakter setine geçer ancak tablolardaki veriler bozulur. Bu durumdaysanız bu betiği kullanmayınız.

Örneklerden de anlayabileceğiniz gibi, eğer tablolarınızda veri varsa ana karakter setini bu betik ile değiştirebilirsiniz ancak verilerinizin karakter setini bu betik değiştirmez. Fakat ana karakter setini değiştirmeden, alt karakter setleri arasında geçiş yapacaksanız tabloda veri olup olmaması "büyük ihtimalle"(tek tek test edecek vaktim yok maalesef) sorun çıkarmayacaktır.

Her ihtimale karşı betiği kullanmadan önce yedek alın. Yaptığınız değişikliklerden, başarılı veya başarısız farketmez, haberdar ederseniz diğer kullanıcılara faydanız olabilir. Ben utf8_general_ci olarak ayarlı ve içinde veri olan tabloları sorunsuz şekilde utf8_turkish_ci olarak ayarlayabildim.
php kodu:
/*
yazan : turker
e-mail : turker.biz@gmail.com
version : 0.01
------------
Üstteki bilgilere dokunmadan, istediğiniz gibi kullanabilir, satabilir ve dağıtabilirsiniz.
*/
# karakter seti ayarları
$charset='utf8';
# bağlantı ayarları
$conn=mysql_connect("localhost","root","") or die('nerdesin mysql?');
mysql_select_db("testdb",$conn) or die('taze bitti');
# karakter seti değiştirilecek alan tipleri
$types=array(
'CHAR',
'VARCHAR',
'TINYTEXT',
'TEXT',
'MEDIUMTEXT',
'LONGTEXT',
'TINYBLOB',
'BLOB',
'MEDIUMBLOB',
'LONGBLOB',
'ENUM',
'SET'
);
/*---------------- yeter bu kadar ayar ----------------------- */
# follow the white rabbit
$q1=mysql_query('SHOW TABLES');
while ($r1=mysql_fetch_array($q1)) {
$table=$r1[0];
$sql='ALTER TABLE '.$table.' CONVERT TO CHARACTER SET '.
$charset.' COLLATE '.$charset.'_turkish_ci';
mysql_query($sql);
echo "\n\n
$table tablosunun karakter seti değiştirildi";
$q2=mysql_query('SHOW FIELDS FROM `'.$table.'`');
while ($r2=mysql_fetch_assoc($q2)) {
//print_r($r2);
$field=$r2['Field'];
$type=strtoupper($r2['Type']);
$null=strtoupper($r2['Null']);
$default=strtoupper($r2['Default']);
if (in_array($type,$types)) {
if ($null=='YES') $null='NULL';
else $null='NOT NULL';
if (!empty($default)) $default='DEFAULT '.$default;
$sql='ALTER TABLE `'.$table.'` MODIFY COLUMN `'.$field.'` '.$type.' CHARACTER SET '.
$charset.' COLLATE '.$charset.'_turkish_ci '.$null.' '.$default;
mysql_query($sql);
} // if
} // while
echo "\n
$table tablosu içindeki alanların karakter seti değiştirildi";
} // while
Başa dön
Kullanıcının profilini görüntüle Özel mesaj gönder E-posta gönder Yazarın web sitesini ziyaret et MSN Messenger
www.turkiyespot.com ucuz hosting
www.turkiyespot.com ucuz hosting





MesajTarih: Cmt Şub 07, 2009 9:54 pm    Mesaj konusu: Advertisement Links

www.turkiyespot.com iyi Hosting vps vds radyo iyi reseller, kaliteli hosting, kaliteli host, kaliteli vps, iyi vps

Başa dön
turkiyespot
Site Admin


Kayıt: 11 Ksm 2005
Mesajlar: 320
Konum: istanbul

MesajTarih: Pzr Şub 08, 2009 12:00 am    Mesaj konusu: 9.1.11. Column Character Set Conversion Alıntıyla Cevap Gönder

9.1.11. Column Character Set Conversion

To convert a binary or non-binary string column to use a particular character set, use ALTER TABLE. For successful conversion to occur, one of the following conditions must apply:

*

If the column has a binary data type (BINARY, VARBINARY, BLOB), all the values that it contains must be encoded using a single character set (the character set you're converting the column to). If you use a binary column to store information in multiple character sets, MySQL has no way to know which values use which character set and cannot convert the data properly.
*

If the column has a non-binary data type (CHAR, VARCHAR, TEXT), its contents should be encoded in the column's character set, not some other character set. If the contents are encoded in a different character set, you can convert the column to use a binary data type first, and then to a non-binary column with the desired character set.

Suppose that a table t has a binary column named col1 defined as VARBINARY(50). Assuming that the information in the column is encoded using a single character set, you can convert it to a non-binary column that has that character set. For example, if col1 contains binary data representing characters in the greek character set, you can convert it as follows:

ALTER TABLE t MODIFY col1 VARCHAR(50) CHARACTER SET greek;

If your original column has a type of BINARY(50), you could convert it to CHAR(50), but the resulting values will be padded with 0x00 bytes at the end, which may be undesirable. To remove these bytes, use the TRIM() function:

UPDATE t SET col1 = TRIM(TRAILING 0x00 FROM col1);

Suppose that table t has a non-binary column named col1 defined as CHAR(50) CHARACTER SET latin1 but you want to convert it to use utf8 so that you can store values from many languages. The following statement accomplishes this:

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET utf8;

Conversion may be lossy if the column contains characters that are not in both character sets.

A special case occurs if you have old tables from MySQL 4.0 or earlier where a non-binary column contains values that actually are encoded in a character set different from the server's default character set. For example, an application might have stored sjis values in a column, even though MySQL's default character set was latin1. It is possible to convert the column to use the proper character set but an additional step is required. Suppose that the server's default character set was latin1 and col1 is defined as CHAR(50) but its contents are sjis values. The first step is to convert the column to a binary data type, which removes the existing character set information without performing any character conversion:

ALTER TABLE t MODIFY col1 BLOB;

The next step is to convert the column to a non-binary data type with the proper character set:

ALTER TABLE t MODIFY col1 CHAR(50) CHARACTER SET sjis;

This procedure requires that the table not have been modified already with statements such as INSERT or UPDATE after an upgrade to MySQL 4.1 or later. In that case, MySQL would store new values in the column using latin1, and the column will contain a mix of sjis and latin1 values and cannot be converted properly.

If you specified attributes when creating a column initially, you should also specify them when altering the table with ALTER TABLE. For example, if you specified NOT NULL and an explicit DEFAULT value, you should also provide them in the ALTER TABLE statement. Otherwise, the resulting column definition will not include those attributes.
Previous / Next / Up / Table of Contents

User Comments
Posted by shimon doodkin on February 1 2005 4:16pm [Delete] [Edit]

<?php
/* $Id: mysqlupgrade.php,v 1.3 2005/01/31 22:04:02 shimon Exp $ */
// upgrade CHARACTER SET for MySQL 4.1.0 +
//
// Did you export all databases including mysql database before runing this file ?
//
// known bug of this program it dont know to treat FULLTEXT index
//
//by Shimon Doodkin shimon_d@hotmail.com

$conn = mysql_connect("localhost", "mashovim.co.il", "***");
$printonly=true; //change this to false to alter on the fly
$charset="hebrew";
$collate="hebrew_general_ci";
$altertablecharset=true;
$alterdatabasecharser=true;

function PMA_getDbCollation($db)
{
$sq='SHOW CREATE DATABASE `'.$db.'`;';
$res = mysql_query($sq);
if(!$res) echo "\n\n".$sq."\n".mysql_error()."\n\n"; else
if($row = mysql_fetch_assoc($res))
{
$tokenized = explode(' ', $row[1]);
unset($row, $res, $sql_query);
for ($i = 1; $i + 3 < count($tokenized); $i++)
{
if ($tokenized[$i] == 'DEFAULT' && $tokenized[$i + 1] == 'CHARACTER' && $tokenized[$i + 2] == 'SET')
{
if (isset($tokenized[$i + 5]) && $tokenized[$i + 4] == 'COLLATE')
{
return array($tokenized [$i + 3],$tokenized[$i + 5]); // We found the collation!
}
else
{
return array($tokenized [$i + 3]);
}
}
}
}
return '';
}

?>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=windows-1251<? //remember to change it if needed ?>" />
<xmp>
<?

$rs2 = mysql_query("SHOW DATABASES");
if(!$rs2) echo "\n\n".$sq."\n".mysql_error()."\n\n"; else
while ($data2 = mysql_fetch_row($rs2))
{
$db=$data2[0];
$db_cha=PMA_getDbCollation($db);
if ( $db!='mysql' /* &&( $db=='mydb_x' || $db=='mydb_y' ) */ ) // limit to database(s) - $db=='mydb_x' || $db=='mydb_y' || $db=='mydb_z'
if ( substr($db_cha[0],0,4)!='utf8' ) // limit to charset
{
mysql_select_db($db);
$rs = mysql_query("SHOW TABLES");
if(!$rs) echo "\n\n".$sq."\n".mysql_error()."\n\n"; else
while ($data = mysql_fetch_row($rs))
{
$rs1 = mysql_query("show FULL columns from $data[0]");
if(!$rs1) echo "\n\n".$sq."\n".mysql_error()."\n\n"; else
while ($data1 = mysql_fetch_assoc($rs1))
{
if(in_array(array_shift(split("\\(",$data1['Type'],2)),array(
//'national char',
//'nchar',
//'national varchar',
//'nvarchar',
'char',
'varchar',
'tinytext',
'text',
'mediumtext',
'longtext',
'enum',
'set'
)))
{
if(substr($data1['Collation'],0,4)!='utf8') // limit to charset
{
$sq="ALTER TABLE `$data[0]` CHANGE `".$data1['Field'].'` `'.$data1['Field'].'` '.$data1['Type'].' CHARACTER SET binary '.($data1['Default']==''?''Sad$data1['Default']=='NULL'?' DEFAULT NULL':' DEFAULT \''.mysql_escape_string($data1['Default']).'\'')).($data1['Null']=='YES'?' NULL ':' NOT NULL').';';
if(!$printonly&&!mysql_query($sq)) echo "\n\n".$sq."\n".mysql_error()."\n\n";
else
{
echo ($sq."\n") ;
$sq="ALTER TABLE `$data[0]` CHANGE `".$data1['Field'].'` `'.$data1['Field'].'` '.$data1['Type']." CHARACTER SET $charset ".($collate==''?'':"COLLATE $collate").($data1['Default']==''?''Sad$data1['Default']=='NULL'?' DEFAULT NULL':' DEFAULT \''.mysql_escape_string($data1['Default']).'\'')).($data1['Null']=='YES'?' NULL ':' NOT NULL').($data1['Comment']==''?'':' COMMENT \''.mysql_escape_string($data1['Comment']).'\'').';';
if(!$printonly&&!mysql_query($sq)) echo "\n\n".$sq."\n".mysql_error()."\n\n";
else echo ($sq."\n") ;
}
}
}
}
if($altertablecharset)
{
/*
$sq='ALTER TABLE `'.$data[0]."` DEFAULT CHARACTER SET binary";
echo ($sq."\n") ;
if(!mysql_query($sq)) echo "\n\n".$sq."\n".mysql_error()."\n\n";
*/
$sq='ALTER TABLE `'.$data[0]."` DEFAULT CHARACTER SET $charset ".($collate==''?'':"COLLATE $collate");
echo ($sq."\n") ;
if(!$printonly)
if(!mysql_query($sq)) echo "\n\n".$sq."\n".mysql_error()."\n\n";
}
}
if($alterdatabasecharser)
{
/*
$sq='ALTER DATABASE `'.$data2[0]."` DEFAULT CHARACTER SET binary";
echo ($sq."\n") ;
if(!mysql_query($sq)) echo "\n\n".$sq."\n".mysql_error()."\n\n";
*/
$sq='ALTER DATABASE `'.$data2[0]."` DEFAULT CHARACTER SET $charset ".($collate==''?'':"COLLATE $collate");
echo ($sq."\n") ;
if(!$printonly)
if(!mysql_query($sq)) echo "\n\n".$sq."\n".mysql_error()."\n\n";
}
}
}
?>
</xmp>
Posted by Mariusz Gniazdowski on February 5 2005 11:27am
Başa dön
Kullanıcının profilini görüntüle Özel mesaj gönder E-posta gönder Yazarın web sitesini ziyaret et MSN Messenger
turkiyespot
Site Admin


Kayıt: 11 Ksm 2005
Mesajlar: 320
Konum: istanbul

MesajTarih: Pzr Şub 08, 2009 12:01 am    Mesaj konusu: [PHP, MySQL] Batch changing charset and collation on databas Alıntıyla Cevap Gönder

[PHP, MySQL] Batch changing charset and collation on databases
Category: Articles, MySQL, PHP — FractalizeR @ 11:51 pm

Recently I needed to quickly change charset on all tables and change each field’s chanset in each table in a specific database to latin1 and collation to latin1_swedish_ci. I googled a little and found this solution by shimon doodkin. I used it and it did work, but also it attempted to change charset at MySQL information_schema system database which is something I didn’t want to. It also proceessed all databases at MySQL server. Luckily, there was only two Smile It was a test server, that’s why I was uncareful.

Ok. I wrote a bit more elegant solution I would like to share with you today. It is pretty self-explanatory and is based on ALTER TABLE CONVERT TO charset MySQL statement.

<?php
// Script written by Vladislav "FractalizeR" Rastrusny
// http://www.fractalizer.ru

//MySQL connection settings
$db_server = 'localhost';
$db_user="root";
$db_password="";

mysql_connect($db_server, $db_user, $db_password) or die(mysql_error());

//Put here a list of databases you need to change charset at or leave array empty to change all existing
$dblist=array();

//If changing at all databases, which databases to skip? information_schema is mysql system databse and no need to change charset on it.
$skip_db_list = array('information_schema', 'mysql');

//Which charset to convert to?
$charset="utf8";

//Which collation to convert to?
$collation="utf8_general_ci";

//Only print queries without execution?
$printonly=true;

//Getting database names if they are not specified
$skip_db_text = '"'.implode('", "', $skip_db_list).'"';
if(count($dblist)<1) {
$sql="SELECT GROUP_CONCAT(`SCHEMA_NAME` SEPARATOR ',') AS FRST FROM `information_schema`.`SCHEMATA` WHERE `SCHEMA_NAME` NOT IN ($skip_db_text)";
$result = mysql_query($sql) or die(mysql_error());
$data = mysql_fetch_assoc ($result);
$dblist=explode(",", $data["FRST"]);
}

//Iterating databases
foreach ($dblist as $dbname) {
$sql="SELECT CONCAT('ALTER TABLE `', t.`TABLE_SCHEMA`, '`.`', t.`TABLE_NAME`, '` CONVERT TO CHARACTER SET $charset COLLATE $collation;') as FRST FROM `information_schema`.`TABLES` t WHERE t.`TABLE_SCHEMA` = '$dbname' ORDER BY 1";

$result = mysql_query($sql) or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
echo $row["FRST"]."\r\n";
if(!$printonly) {
mysql_query($row["FRST"]) or die(mysql_error());
}
}
}
?>

That is all. It is not long and easy-to-use
Başa dön
Kullanıcının profilini görüntüle Özel mesaj gönder E-posta gönder Yazarın web sitesini ziyaret et MSN Messenger
Önceki mesajları göster:   
Yeni başlık gönder   Başlığa cevap gönder    www.turkiyespot.com web sayfası kontrol panelleleri yardımlaşma forumları Forum Ana Sayfa -> PHP SCRİPTLER Tüm zamanlar GMT +2 Saat
1. sayfa (Toplam 1 sayfa)

 
Geçiş Yap:  
Bu forumda yeni başlıklar açamazsınız
Bu forumdaki başlıklara cevap veremezsiniz
Bu forumdaki mesajlarınızı değiştiremezsiniz
Bu forumdaki mesajlarınızı silemezsiniz
Bu forumdaki anketlerde oy kullanamazsınız


Powered by phpBB © 2001, 2005 phpBB Group
Türkçe Çeviri: phpBB Turkey & Erdem Çorapçıoğlu