Veritabanı latin1_general_ci
şimdi ve harmanlama değiştirmek istiyorum utf8mb4_general_ci
.
PhpMyAdmin veritabanı, tablo, sütun harmanlamasını değiştirmek için herhangi bir ayar var mı? Tek tek değiştirmek yerine?
Veritabanı latin1_general_ci
şimdi ve harmanlama değiştirmek istiyorum utf8mb4_general_ci
.
PhpMyAdmin veritabanı, tablo, sütun harmanlamasını değiştirmek için herhangi bir ayar var mı? Tek tek değiştirmek yerine?
Yanıtlar:
Her bir tabloyu ayrı ayrı dönüştürmeniz gerekir:
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4
(bu sütunları da dönüştürür) veya veritabanını dışa latin1
aktarıp geri içe aktarır utf8mb4
.
@rsensan
: CONVERT
sütunların harmanlamasını da değiştirir.
database
VARSAYILAN KARAKTER SETİ utf8 VARSAYILAN TOPLAMA utf8_general_ci;
MYTABLE
Sorgum : ALTER TABLE KARAKTER SETİNE DÖNÜŞ utf8mb4 COLLATE utf8mb4_unicode_ci; Lütfen artık utf8_general_ci kullanmayın ;-)
OP'nin sorduğu gibi burada katkıda bulunuyorum:
Veritabanı, tablo, sütun harmanlaması nasıl değiştirilir?
Seçilen cevap sadece tablo düzeyinde belirtir.
Veritabanını geniş değiştirme:
ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Tablo başına değiştirme:
ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
İyi uygulama, sütun düzeyinde de değiştireceği için tablo düzeyinde değiştirmektir. Belirli bir sütun için değiştirme, belirli bir durum içindir.
Belirli bir sütun için harmanlamayı değiştirme:
ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SELECT table_schema , table_name , column_name , COLLATION_NAME , COLUMN_TYPE FROM information_schema.columns WHERE collation_name != 'utf8_general_ci' AND table_schema not in ('information_schema','mysql', 'performance_schema','sys');
Bir php betiği çalıştırabilirsiniz.
<?php
$con = mysql_connect('localhost','user','password');
if(!$con) { echo "Cannot connect to the database ";die();}
mysql_select_db('dbname');
$result=mysql_query('show tables');
while($tables = mysql_fetch_array($result)) {
foreach ($tables as $key => $value) {
mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
}}
echo "The collation of your database has been successfully changed!";
?>
Tabloların harmanlamasını ayrı ayrı değiştirmek için,
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8
Tüm veritabanının varsayılan harmanlamasını ayarlamak için,
ALTER DATABASE `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin
ya da başka,
Goto PhpMyAdmin-> Faaliyetleri> Harmanlama.
Orada tüm mevcut harmanlamaları içeren bir seçim kutusu bulacaksınız. Böylece burada harmanlamanızı değiştirebilirsiniz. Bu yüzden burada yeni bir sütun oluştururken veritabanı tablosu bu harmanlamayı izleyecektir. Yeni sütunlar oluştururken harmanlama seçmeye gerek yoktur.
Aşağıdaki sorgu, tüm tablolardaki tüm uygun sütunların harmanlamasını belirli bir türe değiştiren ALTER sorguları oluşturur (aşağıdaki örneğimde utf8_general_ci).
SELECT concat
(
'ALTER TABLE ',
t1.TABLE_SCHEMA,
'.',
t1.table_name,
' MODIFY ',
t1.column_name,
' ',
t1.data_type,
'(' ,
CHARACTER_MAXIMUM_LENGTH,
')',
' CHARACTER SET utf8 COLLATE utf8_general_ci;'
)
from
information_schema.columns t1
where
t1.TABLE_SCHEMA like 'you_db_name_goes_here' AND
t1.COLLATION_NAME IS NOT NULL AND
t1.COLLATION_NAME NOT IN ('utf8_general_ci');
information_schema.tables
ve kod concatALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
PhpMyAdmin >> çalıştır veritabanı seçin >> tablo seçin >> "Tablo seçenekleri" bölümünde >> "İşlemler" sekmesine gidin >> açılır listeden Harmanlama'yı seçebilirsiniz >> ve sonra {Go} ekranın üstünde bir mesaj göreceksiniz:
SQL sorgunuz başarıyla yürütüldü
ve bir senaryo
ALTER TABLE `tableName` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci
Ancak mevcut sütunların harmanlamalarını DEĞİŞTİRMEYECEKTİR. Bunu yapmak için bu komut dosyasını kullanabilirsiniz (bu da phpMyAdmin'den geldi)
ALTER TABLE `tableName` CHANGE `Name` `Name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
varsayılan harmanlamayı çeşitli düzeylerde ayarlayabilirsiniz:
http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
1) istemci 2) sunucu varsayılanı 3) veritabanı varsayılanı 4) tablo varsayılanı 5) sütun
Tüm veritabanı tablolarını bir kerede dönüştürmek için bu SQL'i çalıştırmanız yeterlidir. COLLATION ve databaseName öğelerini ihtiyacınız olana değiştirin.
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," COLLATE utf8_general_ci;") AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="databaseName"
AND TABLE_TYPE="BASE TABLE";
Tüm tablolarınızın CHARSET ve COLLATION değerlerini PHP betiği üzerinden aşağıdaki gibi değiştirebilirsiniz. Ben hkasera yanıtı gibi ama bununla ilgili sorgu her tabloda iki kez çalışır olmasıdır. Bu kod mysql yerine MySqli kullanmak ve çift sorgulamanın önlenmesi dışında neredeyse aynıdır. Oy verebilseydim, hkasera'nın cevabını oylardım.
<?php
$conn1=new MySQLi("localhost","user","password","database");
if($conn1->connect_errno){
echo mysqli_connect_error();
exit;
}
$res=$conn1->query("show tables") or die($conn1->error);
while($tables=$res->fetch_array()){
$conn1->query("ALTER TABLE $tables[0] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci") or die($conn1->error);
}
echo "The collation of your database has been successfully changed!";
$res->free();
$conn1->close();
?>
CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin
.
Bu kodu komut dosyasına kolayca ekleyebilirsiniz
//Database Connection
$host = 'localhost';
$db_name = 'your_database_name';
$db_user = 'your_database_user_name';
$db_pass = 'your_database_user_password';
$con = mysql_connect($host,$db_user,$db_pass);
if(!$con) { echo "Cannot connect to the database ";die();}
mysql_select_db($db_name);
$result=mysql_query('show tables');
while($tables = mysql_fetch_array($result)) {
foreach ($tables as $key => $value) {
mysql_query("ALTER TABLE $value CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci");
}
}
echo "The collation of your database has been successfully changed!";
Öğrenmek için şaşırdım ve bu yüzden buraya gelip raporlamak zorunda kaldım, mükemmel ve bakımlı Interconnect / GÜVENLİ ARAMA VE VERİTABANI ÜZERİNDE DEĞİŞTİR komut dosyasında tabloları utf8 / unicode'a dönüştürmek ve hatta innodb'a dönüştürmek için bazı seçenekler var . Veritabanına dayalı bir web sitesini (Wordpress, Drupal, Joomla, vb.) Bir alan adından diğerine geçirmek için yaygın olarak kullanılan bir komut dosyasıdır.
Burada okudum, her tabloyu manuel olarak dönüştürmeniz gerekiyor, bu doğru değil. İşte bir saklı yordam ile nasıl yapılacağı bir çözüm:
DELIMITER $$
DROP PROCEDURE IF EXISTS changeCollation$$
-- character_set parameter could be 'utf8'
-- or 'latin1' or any other valid character set
CREATE PROCEDURE changeCollation(IN character_set VARCHAR(255))
BEGIN
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_table_name varchar(255) DEFAULT "";
DECLARE v_message varchar(4000) DEFAULT "No records";
-- This will create a cursor that selects each table,
-- where the character set is not the one
-- that is defined in the parameter
DECLARE alter_cursor CURSOR FOR SELECT DISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE()
AND COLLATION_NAME NOT LIKE CONCAT(character_set, '_%');
-- This handler will set the value v_finished to 1
-- if there are no more rows
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET v_finished = 1;
OPEN alter_cursor;
-- Start a loop to fetch each rows from the cursor
get_table: LOOP
-- Fetch the table names one by one
FETCH alter_cursor INTO v_table_name;
-- If there is no more record, then we have to skip
-- the commands inside the loop
IF v_finished = 1 THEN
LEAVE get_table;
END IF;
IF v_table_name != '' THEN
IF v_message = 'No records' THEN
SET v_message = '';
END IF;
-- This technic makes the trick, it prepares a statement
-- that is based on the v_table_name parameter and it means
-- that this one is different by each iteration inside the loop
SET @s = CONCAT('ALTER TABLE ',v_table_name,
' CONVERT TO CHARACTER SET ', character_set);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET v_message = CONCAT('The table ', v_table_name ,
' was changed to the default collation of ', character_set,
'.\n', v_message);
SET v_table_name = '';
END IF;
-- Close the loop and the cursor
END LOOP get_table;
CLOSE alter_cursor;
-- Returns information about the altered tables or 'No records'
SELECT v_message;
END $$
DELIMITER ;
Prosedür oluşturulduktan sonra basitçe arayın:
CALL changeCollation('utf8');
Daha fazla bilgi için bu blogu okuyun .
bir şemadaki varsayılan karakter kümesini güncellemek istiyorsanız:
ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;
Aşağıdaki kabuk betiğini kullandım. Veritabanı adını parametre olarak alır ve tüm tabloları başka bir karakter kümesine ve harmanlamaya dönüştürür (kodda tanımlanan başka bir parametre veya varsayılan değer tarafından verilir).
#!/bin/bash
# mycollate.sh <database> [<charset> <collation>]
# changes MySQL/MariaDB charset and collation for one database - all tables and
# all columns in all tables
DB="$1"
CHARSET="$2"
COLL="$3"
[ -n "$DB" ] || exit 1
[ -n "$CHARSET" ] || CHARSET="utf8mb4"
[ -n "$COLL" ] || COLL="utf8mb4_general_ci"
echo $DB
echo "ALTER DATABASE $DB CHARACTER SET $CHARSET COLLATE $COLL;" | mysql
echo "USE $DB; SHOW TABLES;" | mysql -s | (
while read TABLE; do
echo $DB.$TABLE
echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;" | mysql $DB
done
)
Benim çözümüm @Dzintars ve @Quassnoi Answer.
SELECT CONCAT("ALTER TABLE ", TABLE_SCHEMA, '.', TABLE_NAME," CONVERT TO CHARACTER SET utf8mb4 ;") AS ExecuteTheString
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA="<your-database>"
AND TABLE_TYPE="BASE TABLE";
Bunu kullanarak CONVERT TO
, tüm Tablolarını <your-database>
istediğiniz kodlamaya dönüştüren bir komut dosyası oluşturur . Bu aynı zamanda her sütunun kodlamasını değiştirir !
SQL isteği ile SQL komut dosyası oluşturmak için daha iyi bir varyant. Varsayılanları / null'ları bozmaz.
SELECT concat
(
'ALTER TABLE ',
t1.TABLE_SCHEMA,
'.',
t1.table_name,
' MODIFY ',
t1.column_name,
' ',
t1.column_type,
' CHARACTER SET utf8 COLLATE utf8_general_ci',
if(t1.is_nullable='YES', ' NULL', ' NOT NULL'),
if(t1.column_default is not null, concat(' DEFAULT \'', t1.column_default, '\''), ''),
';'
)
from
information_schema.columns t1
where
t1.TABLE_SCHEMA like 'your_table_here' AND
t1.COLLATION_NAME IS NOT NULL AND
t1.COLLATION_NAME NOT IN ('utf8_general_ci');
Hızlı yol - SQL dosyasına aktarın, değiştirmeniz gereken metni değiştirmek için ara ve değiştir'i kullanın. Yeni veritabanı oluşturun, verileri alın ve eski veritabanını ve yeni veritabanını eski adıyla yeniden adlandırın.
Bir veritabanının tüm tablolarındaki tüm alanların harmanlamasını aynı anda değiştirmek için:
Daha önce belirtilen Php yoluyla çözüm tablolar içindeki alanlar için başka bir döngü ekliyordu. Bu yardımcı oldu, tablolardaki tüm alanlar da dönüştürülür.
<?php
$con = mysql_connect('localhost','user','pw');
if(!$con) { echo "Cannot connect to the database ";die();}
mysql_select_db('database_name');
$result=mysql_query('show tables');
while($tables = mysql_fetch_array($result)) {
foreach ($tables as $key => $table) { // for each table
$sql = "ALTER TABLE $table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci";
echo "\n".$sql;
mysql_query($sql);
$sql = "show fields in ".$table." where type like 'varchar%' or type like 'char%' or type='text' or type='mediumtext';";
$rs2=mysql_query($sql);
while( $rw2 = mysql_fetch_array($rs2) ){ // for each field in table
$sql = "ALTER TABLE `".$table."` CHANGE `".$rw2['Field']."` `".$rw2['Field']."` ".$rw2['Type']." CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;";
echo "\n".$sql;
mysql_query($sql);
}
}
}
echo "The collation of your database has been successfully changed!";
?>}
Ben sadece verilen bir veritabanındaki tüm tabloları bulmak ve onları (ve sütunlarını) örtmek için bir bash betiği yazdım.
Komut dosyasına buradan ulaşabilirsiniz: https://github.com/Juddling/mysql-charset