Veritabanı, tablo, sütun harmanlaması nasıl değiştirilir?


Yanıtlar:


260

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 latin1aktarıp geri içe aktarır utf8mb4.


15
Ama sütunların harmanlamasını değiştirmek istiyorum. Bu sadece tablo harmanlama değişecektir ..
user158469

7
@rsensan: CONVERTsütunların harmanlamasını da değiştirir.
Quassnoi

21
ALTER SCHEMA database VARSAYILAN KARAKTER SETİ utf8 VARSAYILAN TOPLAMA utf8_general_ci;
stormwild

8
@stormwild: Bu mevcut tabloları etkilemeyecek
Quassnoi

47
MYTABLESorgum : ALTER TABLE KARAKTER SETİNE DÖNÜŞ utf8mb4 COLLATE utf8mb4_unicode_ci; Lütfen artık utf8_general_ci kullanmayın ;-)
Kapitein Witbaard

213

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;

15
Bu aslında soruyu doğrudan cevaplıyor. Tablo düzeyinde değişiklikleri sütunları güncellemek DEĞİL gibi, bu gerekli. Bunu daha sonra araştıracağım; ama bu beni zor zamanlardan geçiren bilgidir. Teşekkürler.
Parapluie

9
Bunun için en iyi cevap.
jubi4dition

Evet, sütun türünü belirtmeniz gerekiyor. İşte tüm türleri almak için sihirli bir komut. Çok satırlı düzenleme kullanarak, buradan başlayarak tüm sütunları bir kerede güncelleme komutunu oluşturabilirsiniz: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');
William Entriken

Tek bir sütun için şunları yapabilirsiniz: ALTER TABLE tablo_adı DEĞİŞTİR sütun_adı VARCHAR (45) COLLATE utf8mb4_bin;
TomoMiha

68

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!";
                ?>

43

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.


Çok teşekkürler, bu yardımcı oldu
JoZ3

15

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');

+1 Bu yanıtı en çok beğeniyorum. Herkesin sihirli bir yerde PHP'si yoktur. Bazıları MySQL ile başka diller kullanır. MySQL Workbench'te çalıştırmak, satırları kopyalamak ve yapıştırmak kolaydı. Ben sadece yukarıdaki için çalıştırmak için ekstra adım yaptı information_schema.tablesve kod concatALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Pierre

1
Bu, manuel olarak temizlenmesi gereken (orta / uzun) metin sütun türlerini
ortadan kaldırır

11

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


5

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";

4

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();

?>

Bu Değiştim söylemek Zabbix 5. Just yükseltme sonrasında, mükemmel benim için çalıştı charset ve harmanlama böyle: CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin.
robe007

4

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!";

4

Öğ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.

komut dosyası komut düğmeleri


3

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 .


2

bir şemadaki varsayılan karakter kümesini güncellemek istiyorsanız:

 ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;

1

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
)

1

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 !


1

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');

0

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.


0

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!";

?>}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.