Tüm MySQL veritabanı karakter kümesini ve harmanlamasını UTF-8'e nasıl dönüştürebilirim?


459

MySQL veritabanı karakter kümesinin tamamını UTF-8'e ve harmanlamayı UTF-8'e nasıl dönüştürebilirim?


22
Daha sonra ziyaretçiler için: Not ilgili sorular kenar çubuğu ve kullanımda utf8_unicode_cideğil utf8_general_ci.
fuxia

14
Eğer tam UTF-8 desteği istiyorsanız muhtemelen de bir karakter kümesi kullanmak isteyeceksiniz utf8mb4ziyade utf8olarak utf8sadece dizi aksine temel dilli uçağı destekler. MySQL 5.5.3 veya üstü sürüm gerektirir.
Martin Steel

4
Yukarıdaki yorumumda bahsetmeyi unuttum, eğer geçiş utf8mb4yaparsanız da harmanlamayı değiştirmeniz gerekecekutf8mb4_unicode_ci
Martin Steel

3
Daha da iyisi, harmanlama utf8mb4_unicode_520_civeya mevcut en son sürüm ne olursa olsun.
Rick James

@MartinSteel Bu karakter seti ile varsayılan olarak harmanlama olduğuna inanıyorum.
VaTo

Yanıtlar:


715

ALTER DATABASEVe ALTER TABLEkomutlarını kullanın .

ALTER DATABASE databasename CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

Eğer MySQL üzerinde kalmaya devam edersen Ya 5.5.2 veya daha eski olan 4 bayt UTF-8 kullanmak destek vermedi utf8yerine utf8mb4:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

12
CONVERT TOTeknik metin olduğunu varsayar doğru (örneğin, Latince 1) başka bir karakter kümesi saklanır ve (örneğin, UTF-8 byte Latince1 dönülmeksizin latin1 sütun içine sıkışmış gibi) karıştırılmış olup.
Rick James

1
Bu, masayı yeniden inşa ederek büyük üretim sistemlerinde olanaksız kılar. Latin1 sütunlarında yalnızca ASCII karakterlerinin depolandığından eminseniz, tablo karakter kümesini / harmanlamayı yeniden oluşturmadan değiştirmek mümkün müdür?
Andrew

@Andrew Büyük üretim sistemleri genellikle bakım için yansıtılmış bir DB'ye sahiptir.
BalusC

1
charcter setinin utf8 olarak değiştirilmesi veri tipimi metinden orta metne değiştirir. Bekleniyor mu?
Jerry

1
@Jerry Muhtemelen, çünkü: "Sütun utf8'e dönüştürülürse, her karakter maksimum 3 × 65,535 = 196,605 bayt uzunluğunda üç bayta kadar gerektirebilir. Bu uzunluk bir METİN sütununun uzunluk baytına sığmaz, bu nedenle MySQL, veri tipini, uzunluk baytlarının 196.605 değerini kaydedebileceği en küçük dize türü olan MEDIUMTEXT'e dönüştürür. Benzer şekilde, bir VARCHAR sütunu MEDIUMTEXT'e dönüştürülebilir. " Karakter Kümesini Değiştirme
jabbascript

129
  1. Yedekleme yapmak!

  2. Sonra veritabanında varsayılan karakter kümelerini ayarlamanız gerekir. Bu, varolan tabloları dönüştürmez, yalnızca yeni oluşturulan tablolar için varsayılanı ayarlar.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. Ardından, varolan tüm tablolardaki sütunları ve sütunlarını dönüştürmeniz gerekir. Bu, geçerli verilerinizin gerçekte geçerli karakter kümesinde olduğunu varsayar. Sütunlarınız bir karakter kümesine ayarlanmış ancak verileriniz başka bir kümede depolanmışsa , bunun nasıl ele alınacağına ilişkin MySQL kılavuzunu kontrol etmeniz gerekecektir .

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

44
Not: ALTER TABLE tablename CHARACTER SET utf8 yalnızca yeni oluşturulan sütunlar için kullanılan bir tablodaki varsayılan karakter kümesini ayarlar. Zaten bir karakter kümesi ayarlanmış olan mevcut sütunları dönüştürmez.
newspire

Önce yedek yedekleme yedeklemesini okumalıydım ... ama şansım, geliştirme ortamında olmasıydı. bu yüzden benim oyum sana gidiyor!
DominikAngerer

4
@DominikAngerer: Ne kırdı?
cic

16
Not utf8_general_ciartık iyi uygulama önerilir. MySQL 5.5.3 sürümünden bu yana kullanmak utf8mb4yerine kullanmalısınız utf8. Her ikisi de UTF-8 kodlamasına atıfta bulunur, ancak daha eski utf8olanların yukarıda belirtilen karakterlerin kullanımını önleyen MySQL'e özgü bir sınırlaması vardı 0xFFFD.
u01jmg3

76

Komut satırı kabuğunda

Komut satırı kabuğundan biriyseniz, bunu çok hızlı bir şekilde yapabilirsiniz. Sadece "dbname" yi doldurun: D

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

Basit kopyalama / yapıştırma için tek astar

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

2
Bu daha fazla ayrıntı koyabilir miyimERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DB="dbname"
steros

@ 4485670 Bunu komut satırı kabuğunda çalıştırmanız gerekir . Yalnızca MySQL istemci bağlantınız varsa, aşağıdaki sdfor kodunu kullanın.
Arnold Daniels

6
Bu kod harika çalışıyor, mysql'den sonra gerektiği gibi -h [ana bilgisayar adı] -u [kullanıcı adı] -p [şifre] eklemeyi unutmayın.
dispers

3
Muhtemelen gerçek bir sistemde yabancı anahtar kontrollerini devre dışı bırakmak isteyeceksiniz: DB="db_name"; ( echo 'ALTER DATABASE '"$ DB"' CHARACTER SET utf8 COLLATE utf8_general_ci; '; mysql - uuser -şifre -hhost "$ DB" -e "TABLO GÖSTER" - toplu iş - atlama sütunu isimleri | xargs -I {} echo 'SET foreign_key_checks = 0; ALTER TABLO '{}'KARAKTER SETİNE DÖNÜŞ utf8 COLLATE utf8_general_ci; ' ) | mysql -uuser -şifre -hhost "$ DB"
Adam Nelson

1
"Tabloları göster" yerine "Table_Type = 'BASE TABLE" tam tabloları göster'i kullanana kadar benim için çalışmadı
Brian Peterson

68

Tüm tabloları aşağıdakilerle güncellemek için sql oluşturabilirsiniz:

SELECT CONCAT("ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CHARACTER SET utf8 COLLATE utf8_general_ci;   ",
    "ALTER TABLE ",TABLE_SCHEMA,".",TABLE_NAME," CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ") 
    AS alter_sql
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = your_database_name;

Çıkışı yakalayın ve çalıştırın.

Arnold Daniels'ın yukarıdaki cevabı daha zarif.


neden iki değiştirme tablosu sorgusu eklediniz? biri yeterli değil mi?
Akshay

7
@Akshay, güzel soru. İlk alter-tablo sorgusu yeni sütunlar için varsayılanı ayarlar ve ikinci alter-tablo sorgusu varolan sütunları dönüştürür.
Sınırsız

4
Bilginize: dev.mysql.com/doc/refman/5.5/tr/alter-table.html MySQL belgelerine göre , ALTER deyiminin "KARAKTER AYARINA DÖN" sürümü her ikisini de tek adımda yapar: "Tablo varsayılanını değiştirmek için karakter kümesini ve tüm karakter sütunlarını (CHAR, VARCHAR, TEXT) yeni bir karakter kümesine ...
devGuy

2
Ben bu hata var # 1054 - Bilinmeyen sütun 'webdb_playground' içinde 'nerede madde' ama eminim benim db doğru olanı
Yannis Dran

1
@YannisDran db adınız WHERE TABLE_SCHEMA=webdb_playground, bilinmeyen sütun hatası veren bir dizede bulunmamış olabilir, ancak WHERE TABLE_SCHEMA="webdb_playground"başarılı olur. Başkasının buna girmesi durumunda denenecek bir şey.
jabbascript

17

Devam etmeden önce şunlardan emin olun: Tam bir veritabanı yedeklemesi tamamladınız!

Adım 1: Veritabanı Düzeyinde Değişiklikler

  • Veritabanınızın Harmanlama ve Karakter kümesini belirleme

    SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM 
    information_schema.SCHEMATA S
    WHERE schema_name = 'your_database_name'
    AND
    (DEFAULT_CHARACTER_SET_NAME != 'utf8'
        OR
     DEFAULT_COLLATION_NAME not like 'utf8%');
  • Veritabanı için harmanlamayı düzeltme

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

2. Adım: Tablo Düzeyinde Değişiklikler

  • Veritabanı Tablolarını yanlış karakter kümesi veya harmanlama ile tanımlama

    SELECT CONCAT(
    'ALTER TABLE ',  table_name, ' CHARACTER SET utf8 COLLATE utf8_general_ci;  ', 
    'ALTER TABLE ',  table_name, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  ')
    FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
    WHERE C.collation_name = T.table_collation
    AND T.table_schema = 'your_database_name'
    AND
    (C.CHARACTER_SET_NAME != 'utf8'
        OR
     C.COLLATION_NAME not like 'utf8%')
  • Tablo sütunlarının harmanlamasını ve karakter kümesini ayarlama

Üst sql çıkışını yakalayın ve çalıştırın. (aşağıdaki gibi)

ALTER TABLE rma CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_products CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_products CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_report_period CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_report_period CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_reservation CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_reservation CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_history CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_history CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;  
ALTER TABLE rma_supplier_return_product CHARACTER SET utf8 COLLATE utf8_general_ci;ALTER TABLE rma_supplier_return_product CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; 

bakınız: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+of+a+MySQL+Database


1
Şu anda bu komut dosyası db için 'utf8_unicode_ci' kullanıyor, ancak tablolar için 'utf8_general_ci' kullanıyor - bu kasıtlı mıydı? (Her ikisinin de aynı karakter setini kullanması gerektiğini düşünüyorum)
gmcnaughton

stackoverflow.com/questions/10957238/… burada daha dolu bir cevap bıraktı
VH

8

HeidiSQL kullanın . Onun özgür ve çok iyi bir db aracı.

Araçlar menüsünden Toplu tablo düzenleyicisine girin

Tüm veritabanını seçin veya dönüştürülecek tabloları seçin,

  • tick Varsayılan harmanlamayı değiştir: utf8mb4_general_ci
  • kene Charset'e dönüştür: utf8

gerçekleştirmek

Bu, birkaç saniyede tam veritabanını latin'den utf8'e dönüştürür.

Tıkır tıkır çalışıyor :)

HeidiSQL varsayılan olarak utf8 olarak bağlanır, böylece artık özel karakterler artık tablo verileri incelenirken kodlanmış olarak değil, karakter (æ ø å) olarak görülmelidir.

Latince'den utf8'e geçerken gerçek tuzak, pdo'nun utf8 charset ile bağlandığından emin olmaktır. Değilse, web sayfanızdaki her yere utf8 tablosuna ve soru işaretlerine eklenen çöp verileri alırsınız, böylece tablo verilerinin utf8 olmadığını düşünürsünüz ...


Lütfen biraz açıklayabilir misiniz? Tam olarak bu sorun var - özel karakterler ve boşluklar soru işaretleri olarak görünür. PHPMyAdmin kullanarak MAMP veritabanını dönüştürmek çalışıyorum. Çevrimdışı geliştirdikten sonra artık sunucumun utf8mb4'ü desteklemediğini keşfediyorum. Windows yok, bu yüzden HeidiSQL kullanamazsınız. PHPMyAdmin ile bunu başarmanın bir yolu var mı?
Şubat'ta RexTheRunt

bu şekilde. özellikle bol masanız var.
tyan

CHARSET: SQL Hatası (1025): Yeniden adlandırma hatası ... ama bu inanılmaz bir SQL yöneticisi aracı dönüştürmeye çalışırken hata alıyorum ve hata!
Marcocopes

Herkes heidisql için iyi bir genel bakış ve öğretici gerekiyorsa, bu makaleye göz atın .
DougB

6

@Sdfor yorumundan esinlenerek, işi yapan bir bash betiği

#!/bin/bash

printf "### Converting MySQL character set ###\n\n"

printf "Enter the encoding you want to set: "
read -r CHARSET

# Get the MySQL username
printf "Enter mysql username: "
read -r USERNAME

# Get the MySQL password
printf "Enter mysql password for user %s:" "$USERNAME"
read -rs PASSWORD

DBLIST=( mydatabase1 mydatabase2 )

printf "\n"


for DB in "${DBLIST[@]}"
do
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
    mysql "$DB" -u"$USERNAME" -p"$PASSWORD" -e "SHOW TABLES" --batch --skip-column-names \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE `'"$CHARSET"'`;'
) \
| mysql "$DB" -u"$USERNAME" -p"$PASSWORD"

echo "$DB database done..."
done

echo "### DONE ###"
exit

4

Verilerin aynı karakter kümesinde olmaması durumunda, bu snippet'i http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html adresinden düşünebilirsiniz.

Sütunda bir ikili olmayan veri türü (CHAR, VARCHAR, TEXT) varsa, içerikleri başka bir karakter kümesinde değil sütun karakter kümesinde kodlanmalıdır. İçerikler farklı bir karakter kümesinde kodlanmışsa, önce sütunu önce ikili veri türünü, sonra da istenen karakter kümesiyle ikili olmayan bir sütuna dönüştürebilirsiniz.

İşte bir örnek:

 ALTER TABLE t1 CHANGE c1 c1 BLOB;
 ALTER TABLE t1 CHANGE c1 c1 VARCHAR(100) CHARACTER SET utf8;

Doğru harmanlamayı seçtiğinizden emin olun, aksi takdirde benzersiz anahtar çakışmaları yaşayabilirsiniz. örneğin Éleanore ve Eleanore bazı harmanlamalarda aynı kabul edilebilir.

kenara:

Bazı karakterlerin veritabanında UTF-8 olarak saklansalar bile e-postalarda "kırıldığı" bir durum vardı. Utf8 verilerini kullanarak e-posta gönderiyorsanız, e-postalarınızı UTF8'de göndermek için de dönüştürmek isteyebilirsiniz.

PHPMailer'da şu satırı güncelleyin: public $CharSet = 'utf-8';


4

Çok sayıda tabloya sahip veritabanları için, veritabanını ve tüm tabloları aşağıdakileri kullanarak güncellemek için basit bir php betiği kullanabilirsiniz:

$conn = mysqli_connect($host, $username, $password, $database);

if ($conn->connect_error) {
  die("Connection failed: " . $conn->connect_error);
}

$alter_database_charset_sql = "ALTER DATABASE ".$database." CHARACTER SET utf8 COLLATE utf8_unicode_ci";
mysqli_query($conn, $alter_database_charset_sql);

$show_tables_result = mysqli_query($conn, "SHOW TABLES");
$tables  = mysqli_fetch_all($show_tables_result);

foreach ($tables as $index => $table) {
  $alter_table_sql = "ALTER TABLE ".$table[0]." CONVERT TO CHARACTER SET utf8  COLLATE utf8_unicode_ci";
  $alter_table_result = mysqli_query($conn, $alter_table_sql);
  echo "<pre>";
  var_dump($alter_table_result);
  echo "</pre>";
}

Bu senaryoyu nereden çalıştırıyoruz?
Yannis Dran

1
@YannisDran Onu yürüttüğünüz IP'nin veritabanına erişimi olduğu sürece önemli değil. Önce bir yedek aldığınızdan emin olun!
Dan Lucas

Güzel, nasıl başaracağız? Sunucuya yüklememiz ve ardından konumunun yolunu girmemiz gerekiyor mu?
Yannis Dran

4
DELIMITER $$  

CREATE PROCEDURE `databasename`.`update_char_set`()  

BEGIN  
 DECLARE done INT DEFAULT 0;  
 DECLARE t_sql VARCHAR(256);  
 DECLARE tableName VARCHAR(128);  
 DECLARE lists CURSOR FOR SELECT table_name FROM `information_schema`.`TABLES` WHERE table_schema = 'databasename';  
 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  
 OPEN lists;  
 FETCH lists INTO tableName;  
 REPEAT  
    SET @t_sql = CONCAT('ALTER TABLE ', tableName, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci');  
    PREPARE stmt FROM @t_sql;  
    EXECUTE stmt;  
    DEALLOCATE PREPARE stmt;  
 FETCH lists INTO tableName;  
 UNTIL done END REPEAT;  
 CLOSE lists;  
END$$  

DELIMITER ;  

CALL databasename.update_char_set();

Teşekkürler, bu aslında tüm veritabanına (yani her tablo) nasıl yapılacağını gösteren birkaç cevap biridir. Bir cazibe gibi çalıştı.
Machisuji

3
mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql
cp dump.sql dump-fixed.sql
vim dump-fixed.sql


:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

3

En güvenli yol, önce sütunları bir ikili tipte değiştirmek ve daha sonra istenen karakter kümesini kullanarak bu tipe geri döndürmektir.

Her sütun türünün, aşağıdaki gibi ilgili ikili türü vardır:

  1. CHAR => İKİLİ
  2. METİN => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR => VARBINARY

Örneğin.:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARBINARY;

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] MODIFY [COLUMN_NAME] VARCHAR(140) CHARACTER SET utf8mb4;

Birkaç latin1 tablolarda denedim ve tüm aksan tuttu.

Bunu yapan tüm sütunlar için bu sorguyu ayıklayabilirsiniz:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' VARBINARY;'),
CONCAT('ALTER TABLE ', TABLE_SCHEMA,'.', TABLE_NAME,' MODIFY ', COLUMN_NAME,' ', COLUMN_TYPE,' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM information_schema.columns
WHERE TABLE_SCHEMA IN ('[TABLE_SCHEMA]')
AND COLUMN_TYPE LIKE 'varchar%'
AND (COLLATION_NAME IS NOT NULL AND COLLATION_NAME NOT LIKE 'utf%');

Bunu tüm sütunlarınızda yaptıktan sonra tüm tablolarda yaparsınız:

ALTER TABLE [TABLE_SCHEMA].[TABLE_NAME] CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

Bu sorguyu tüm tablonuz için oluşturmak için aşağıdaki sorguyu kullanın:

SELECT
CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_COLLATION NOT LIKE 'utf8%'
and TABLE_SCHEMA in ('[TABLE_SCHEMA]');

Ve şimdi tüm sütunlarınızı ve tablolarınızı değiştirdiğinize göre, veritabanında da aynısını yapın:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;

1

Tablolarınızı dönüştürmek için alamıyorsanız veya tablonuz her zaman utf8 olmayan bir karakter kümesine ayarlanmışsa, ancak utf8'i istiyorsanız, en iyi seçeneğiniz onu silmek ve yeniden başlamak ve açıkça belirtmek olabilir:

create database database_name character set utf8;

0

Benim için çalışan tek çözüm: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

Tablo içeren bir veritabanını dönüştürme

mysqldump -uusername -ppassword -c -e --default-character-set=utf8 --single-transaction --skip-set-charset --add-drop-database -B dbname > dump.sql

cp dump.sql dump-fixed.sql
vim dump-fixed.sql

:%s/DEFAULT CHARACTER SET latin1/DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci/
:%s/DEFAULT CHARSET=latin1/DEFAULT CHARSET=utf8/
:wq

mysql -uusername -ppassword < dump-fixed.sql

0

tabloyu değiştir table_name charset = 'utf8';

Bu, benim durumum için kullanabildiğim basit bir sorgu, table_name gereksinimlerinize göre değiştirebilirsiniz.


Normalde bir cevaba eşlik etmenizi önerdiğiniz şeyin bir açıklaması eşlik etmelidir.
RiggsFolly

0

Veritabanı için karakter kümesi kodlamasını UTF-8 olarak değiştirmek için, mysql> komut istemine aşağıdaki komutu yazın. DBNAME yerine veritabanı adını yazın:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;

0

Ayrıca DB aracı Navicat, daha kolay yapar.

  • Siva.

Veritabanınızı sağ tıklayın ve Açılır Menü'de istediğiniz gibi DB Özellikleri ve Değiştir'i seçin

resim açıklamasını buraya girin


0

Komut Satırı Çözümü ve Dışlama Görünümleri

Ben sadece @ Jasny gibi ve diğerleri bizim veritabanında görüşlere cevap yanıtını tamamlıyorum @Brian.

Böyle bir hatayla karşılaşırsanız:

ERROR 1347 (HY000) at line 17: 'dbname.table_name' is not of type 'BASE TABLE'

Çünkü muhtemelen görüşleriniz vardır ve bunları hariç tutmanız gerekir. Ancak bunları hariç tutmaya çalışırken, MySQL 1 yerine 2 sütun döndürür.

SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE';
-- table_name1  BASE TABLE
-- table_name2  BASE TABLE

Bu yüzden awksadece tablo adını içeren 1. sütunu çıkarmak için Jasny'nin komutunu uyarlamamız gerekiyor .

DB="dbname"
(
    echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'
    mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names \
    | awk '{print $1 }' \
    | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;'
) \
| mysql "$DB"

Basit kopyalama / yapıştırma için tek astar

DB="dbname"; ( echo 'ALTER DATABASE `'"$DB"'` CHARACTER SET utf8 COLLATE utf8_general_ci;'; mysql "$DB" -e "SHOW FULL TABLES WHERE Table_Type = 'BASE TABLE'" --batch --skip-column-names | awk '{print $1 }' | xargs -I{} echo 'ALTER TABLE `'{}'` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;' ) | mysql "$DB"

-1

Karakter kümesi kodlamasını UTF-8 olarak değiştirmek için PHPMyAdmin'deki basit adımları izleyin

  1. Veritabanınızı seçin SS

  2. Operasyonlara Git SS

  3. İşlemler sekmesinde, alt harmanlama açılır menüsünde, kodlama istediğinizi seçin (utf8_general_ci) ve ayrıca tüm tablo harmanlamalarını değiştir onay kutusunu işaretleyin, (2) Tüm tablo sütunları harmanlamalarını değiştirin. ve Go düğmesine basın.

SS

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.