Jak przekonwertować cały zestaw znaków i zestawienie bazy danych MySQL na UTF-8?

459

Jak przekonwertować cały zestaw znaków bazy danych MySQL na UTF-8 i zestawienie na UTF-8?

Dziekan
źródło
22
Do późniejszych gości: zanotuj powiązane pytania na pasku bocznym i użyj utf8_unicode_ci, nie utf8_general_ci.
fuxia
14
Jeśli chcesz mieć pełną obsługę UTF-8, prawdopodobnie będziesz chciał użyć zestawu znaków utf8mb4zamiast, utf8ponieważ utf8obsługuje tylko podstawową płaszczyznę wielojęzyczną, a nie pełny zakres. Wymaga MySQL 5.5.3 lub nowszego.
Martin Steel
4
Zapomniałem wspomnieć w moim komentarzu powyżej, jeśli przełączysz się na, utf8mb4musisz także zmienić sortowanie nautf8mb4_unicode_ci
Martin Steel
3
Jeszcze lepiej, sortowanie utf8mb4_unicode_520_cilub cokolwiek jest najnowszą dostępną wersją.
Rick James
@MartinSteel Uważam, że jest to domyślnie zestawienie z tym zestawem znaków.
VaTo

Odpowiedzi:

715

Użyj poleceń ALTER DATABASEi ALTER TABLE.

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

Lub jeśli nadal korzystasz z MySQL 5.5.2 lub starszego, który nie obsługiwał 4-bajtowego UTF-8, użyj utf8zamiast utf8mb4:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
BalusC
źródło
12
CONVERT TOMetoda zakłada, że treść została prawidłowo przechowywane w innej kodowania (np latin1) i nie zniekształcone (np UTF-8 bajtów wtłoczone latin1 kolumny bez konwersji latin1).
Rick James
1
To odbudowuje stół, czyniąc go niewykonalnym w dużych systemach produkcyjnych. Jeśli jest pewne, że tylko znaki ASCII są przechowywane w kolumnach latin1, czy można zmienić zestaw znaków tabeli / zestawianie bez przebudowywania?
Andrew
@Andrew Duże systemy produkcyjne zwykle mają lustrzaną bazę danych do konserwacji.
BalusC
1
zmiana charctera na utf8 zmienia mój typ danych z tekstu na średni tekst. Czy jest to oczekiwane
Jerry
1
@Jerry Prawdopodobnie, ponieważ: „Jeśli kolumna zostanie przekonwertowana na utf8, każdy znak może wymagać maksymalnie trzech bajtów, dla maksymalnej możliwej długości 3 × 65 535 = 196 605 bajtów. Ta długość nie pasuje do bajtów długości kolumny TEXT, więc MySQL konwertuje typ danych na MEDIUMTEXT, który jest najmniejszym typem ciągu, dla którego bajty długości mogą zapisać wartość 196 605. Podobnie kolumna VARCHAR może zostać przekonwertowana na MEDIUMTEXT. ” Zmiana zestawu znaków
jabbascript
129
  1. Zrób kopię zapasową!

  2. Następnie musisz ustawić domyślne zestawy znaków w bazie danych. Nie powoduje to konwersji istniejących tabel, a jedynie ustawienie domyślne dla nowo tworzonych tabel.

    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. Następnie musisz przekonwertować zestaw znaków na wszystkich istniejących tabelach i ich kolumnach. Zakłada się, że bieżące dane znajdują się w bieżącym zestawie znaków. Jeśli twoje kolumny są ustawione na jeden zestaw znaków, ale twoje dane są naprawdę przechowywane w innym, musisz sprawdzić instrukcję MySQL, jak sobie z tym poradzić.

    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
gazeta
źródło
44
Uwaga: ALTER TABLE tablename CHARACTER SET utf8 ustawia tylko domyślny zestaw znaków dla tabeli, która jest używana dla nowo tworzonych kolumn. Nie konwertuje istniejących kolumn, które mają już ustawiony zestaw znaków.
gazeta
Powinienem był najpierw przeczytać kopię zapasową kopii zapasowej ... ale miałem szczęście, że była w środowisku programistycznym. więc moja opinia przychodzi do ciebie!
DominikAngerer
4
@DominikAngerer: Co się zepsuło?
cykl
16
Pamiętaj, że utf8_general_cinie jest już zalecaną najlepszą praktyką. Od MySQL 5.5.3 powinieneś używać utf8mb4zamiast utf8. Oba odnoszą się do kodowania UTF-8, ale starsze utf8miały specyficzne dla MySQL ograniczenie uniemożliwiające użycie znaków o numerach powyżej 0xFFFD.
u01jmg3
76

W powłoce wiersza poleceń

Jeśli jesteś jednym z wiersza poleceń, możesz to zrobić bardzo szybko. Wystarczy wpisać „dbname”: 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"

Jednowarstwowy do prostego kopiowania / wklejania

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"
Arnold Daniels
źródło
2
Czy możesz ERROR 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"
podać
@ 4485670 Musisz uruchomić to w powłoce wiersza poleceń . Jeśli masz dostępne tylko połączenie klienta MySQL, użyj kodu sdfor poniżej.
Arnold Daniels
6
Ten kod działa świetnie, pamiętaj tylko o dodaniu -h [nazwa hosta] -u [nazwa użytkownika] -p [hasło] po mysql, jeśli to konieczne.
rozproszyć
3
Prawdopodobnie będziesz chciał wyłączyć sprawdzanie klucza obcego w prawdziwym systemie: DB="db_name"; ( echo 'ALTER DATABASE '"$ DB"' 'ZNAK ZESTAWU utf8 COLLATE utf8_general_ci;'; mysql --uuser -ppassword -hhost "$ DB" -e "SHOW TABLES" --batch --skip-column-names | xargs -I {} echo 'SET Foreign_key_checks = 0; ALTER TABLE '{}'CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci; ' ) | mysql -uuser -ppassword -hhost "$ DB" '
Adam Nelson
1
Nie działało dla mnie, dopóki nie użyłem „pokaż pełne tabele, w których Table_Type = 'BASE TABLE'” zamiast „SHOW TABLES”
Brian Peterson
68

Możesz utworzyć sql, aby zaktualizować wszystkie tabele za pomocą:

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;

Przechwyć wyjście i uruchom je.

Powyższa odpowiedź Arnolda Danielsa jest bardziej elegancka.

sdfor
źródło
dlaczego dodałeś dwa zapytania do tabeli zmian? jeden nie wystarczy?
Akshay
7
@Ashshay, dobre pytanie. Pierwsze zapytanie w tabeli zmian ustawia wartości domyślne dla nowych kolumn, a drugie zapytanie w tabeli zmian przekształca istniejące kolumny.
UnlimitedInfinity
4
FYI: zgodnie z dev.mysql.com/doc/refman/5.5/en/alter-table.html dokumentacją MySQL wersja instrukcji ALTER „CONVERT TO CHARACTER SET” robi oba w jednym kroku: „Aby zmienić domyślną tabelę zestaw znaków i wszystkie kolumny znaków (CHAR, VARCHAR, TEXT) do nowego zestawu znaków ...
devGuy
2
Mam ten błąd # 1054 - Nieznana kolumna „webdb_playground” w „klauzula where”, ale jestem pewien, że moja db jest poprawna
Yannis Dran
1
@YannisDran Twoja nazwa bazy danych mogła nie być ciągiem, przez WHERE TABLE_SCHEMA=webdb_playgroundco wystąpił błąd nieznanej kolumny, ale WHERE TABLE_SCHEMA="webdb_playground"byłby udany. Coś, co można wypróbować na wypadek, gdyby ktoś wpadł na to.
jabbascript
17

Przed kontynuowaniem upewnij się, że: Wykonałeś pełną kopię zapasową bazy danych!

Krok 1: Zmiany na poziomie bazy danych

  • Identyfikacja zestawu zestawień i znaków w bazie danych

    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%');
  • Naprawianie sortowania dla bazy danych

    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Krok 2: Zmiany na poziomie stołu

  • Identyfikacja tabel bazy danych z niepoprawnym zestawem znaków lub zestawieniem

    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%')
  • Dostosowywanie zestawiania kolumn tabeli i zestawu znaków

Przechwyć górne wyjście SQL i uruchom je. (jak obserwowanie)

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; 

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

John Yin
źródło
1
Obecnie ten skrypt używa „utf8_unicode_ci” dla bazy danych, ale „utf8_general_ci” dla tabel - czy to było zamierzone? (Myślę, że oba powinny używać tego samego zestawu znaków)
gmcnaughton
stackoverflow.com/questions/10957238/… zostawił tutaj pełniejszą odpowiedź
VH
8

Użyj HeidiSQL . Jest to bezpłatne i bardzo dobre narzędzie db.

Z menu narzędzi przejdź do edytora tabel zbiorczych

Wybierz całą bazę danych lub wybierz tabele do konwersji,

  • zaznacz Zmień domyślne sortowanie: utf8mb4_general_ci
  • zaznacz Konwertuj na zestaw znaków: utf8

Wykonać

Konwertuje to kompletną bazę danych z łacińskiego na utf8 w zaledwie kilka sekund.

Działa jak marzenie :)

HeidiSQL łączy się domyślnie jako utf8, więc wszelkie znaki specjalne powinny być teraz postrzegane jako znak (æ ø å), a nie jako zakodowane podczas sprawdzania danych tabeli.

Prawdziwą pułapką przy przechodzeniu z łaciny na utf8 jest upewnienie się, że pdo łączy się z zestawem znaków utf8. Jeśli nie, dane śmieci zostaną wstawione do tabeli utf8 i znaki zapytania w dowolnym miejscu na swojej stronie internetowej, co sprawi, że myślisz, że dane tabeli nie są utf8 ...

Tomek
źródło
Czy mógłbyś opracować proszę? Mam dokładnie ten problem - znaki specjalne i spacje pojawiają się jako znaki zapytania. Próbuję przekonwertować bazę danych w MAMP przy użyciu PHPMyAdmin. Po opracowaniu offline odkryłem, że mój host nie obsługuje utf8mb4. Nie mam systemu Windows, więc nie mogę używać HeidiSQL. Czy mogę to osiągnąć za pomocą PHPMyAdmin?
RexTheRunt
jak w ten sposób. szczególnie masz dużo stolika.
tyan
Występuje błąd podczas próby konwersji CHARSET: Błąd SQL (1025): Błąd przy zmianie nazwy ... ale to niesamowite narzędzie do zarządzania SQL!
marcolopes,
Jeśli ktoś potrzebuje dobrego przeglądu i samouczka dla heidisql, zapoznaj się z tym artykułem .
DougB
6

Inspirowany komentarzem @sdfor, oto skrypt bash, który wykonuje zadanie

#!/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
Camoflame
źródło
4

Jeśli dane nie są w tym samym zestawie znaków, możesz rozważyć ten fragment kodu ze strony http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

Jeśli kolumna ma niebinarny typ danych (CHAR, VARCHAR, TEXT), jej zawartość powinna być zakodowana w zestawie znaków kolumny, a nie w innym zestawie znaków. Jeśli zawartość jest zakodowana w innym zestawie znaków, możesz przekonwertować kolumnę, aby najpierw użyła binarnego typu danych, a następnie kolumnę niebinarną z żądanym zestawem znaków.

Oto przykład:

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

Upewnij się, że wybierasz odpowiednie sortowanie, w przeciwnym razie możesz uzyskać unikalne konflikty kluczy. np. Éleanore i Eleanore mogą być uważane za takie same w niektórych zestawieniach.

Na bok:

Miałem sytuację, w której niektóre znaki „pękały” w wiadomościach e-mail, mimo że były przechowywane w bazie danych jako UTF-8. Jeśli wysyłasz wiadomości e-mail przy użyciu danych utf8, możesz również chcieć przekonwertować swoje wiadomości e-mail, aby wysyłać je w UTF8.

W PHPMailer, po prostu zaktualizuj ten wiersz: public $CharSet = 'utf-8';

Frank Forte
źródło
4

W przypadku baz danych, które mają dużą liczbę tabel, możesz użyć prostego skryptu php, aby zaktualizować zestaw znaków bazy danych i wszystkich tabel, używając:

$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>";
}
Dan Lucas
źródło
Skąd uruchamiamy ten skrypt?
Yannis Dran
1
@YannisDran Nie powinno to mieć znaczenia, o ile adres IP, z którego go wykonujesz, ma dostęp do bazy danych. Najpierw wykonaj kopię zapasową!
Dan Lucas
Dobrze i jak to robimy? Czy musimy załadować go na serwer, a następnie uruchomić, wprowadzić ścieżkę do jego pozycji?
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();
剑 二十 三
źródło
Dzięki, jest to jedna z niewielu odpowiedzi, które pokazują, jak to zrobić dla całej bazy danych (tj. Każdej tabeli). Działa jak urok.
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
Soumik Guha
źródło
3

Najbezpieczniejszym sposobem jest zmodyfikowanie kolumn najpierw do typu binarnego, a następnie zmodyfikowanie go z powrotem do tego typu za pomocą pożądanego zestawu znaków.

Każdy typ kolumny ma swój odpowiedni typ binarny, jak następuje:

  1. CHAR => BINARY
  2. TEKST => BLOB
  3. TINYTEXT => TINYBLOB
  4. MEDIUMTEXT => MEDIUMBLOB
  5. LONGTEXT => LONGBLOB
  6. VARCHAR => VARBINARY

Na przykład.:

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

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

Próbowałem na kilku stołach Latin1 i zachowałem wszystkie znaki diakrytyczne.

Możesz wyodrębnić to zapytanie dla wszystkich kolumn, które to robią:

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

Po wykonaniu tego we wszystkich kolumnach, to we wszystkich tabelach:

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

Aby wygenerować to zapytanie dla całej tabeli, użyj następującego zapytania:

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

A teraz, gdy zmodyfikowałeś wszystkie swoje kolumny i tabele, zrób to samo w bazie danych:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
Malachit BR
źródło
1

Jeśli nie możesz przekonwertować swoich tabel lub twój stół jest zawsze ustawiony na jakiś zestaw znaków inny niż utf8, ale chcesz utf8, najlepszym rozwiązaniem może być wymazanie go i rozpoczęcie od nowa i wyraźne określenie:

create database database_name character set utf8;
użytkownik3013048
źródło
0

Jedyne rozwiązanie, które działało dla mnie: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

Konwertowanie bazy danych zawierającej tabele

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
utapyngo
źródło
0

alter table nazwa_tabeli charset = 'utf8';

Jest to proste zapytanie, którego mogłem użyć w moim przypadku, możesz zmienić nazwę tabeli zgodnie ze swoimi wymaganiami.

Aditya Seth
źródło
Zazwyczaj do odpowiedzi należy dołączyć wyjaśnienie tego, co sugerujesz zrobić.
RiggsFolly
0

Aby zmienić kodowanie zestawu znaków na UTF-8 dla samej bazy danych, wpisz następujące polecenie w wierszu polecenia mysql>. Zamień DBNAME na nazwę bazy danych:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
Nyein Aung
źródło
0

Możesz także użyć narzędzia DB Navicat, co czyni to łatwiejszym.

  • Siva

Kliknij prawym przyciskiem myszy swoją bazę danych i wybierz Właściwości DB i Zmień zgodnie z potrzebami w menu rozwijanym

wprowadź opis zdjęcia tutaj

rvsiva17
źródło
0

Rozwiązanie wiersza polecenia i wyklucz widoki

Ja po prostu ukończenie @ Jasny za odpowiedź dla innych jak @Briani ja, którzy mają poglądy w naszej bazie danych.

Jeśli masz taki błąd:

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

To dlatego, że prawdopodobnie masz poglądy i musisz je wykluczyć. Ale podczas próby ich wykluczenia MySQL zwraca 2 kolumny zamiast 1.

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

Musimy więc dostosować polecenie Jasnego, awkaby wyodrębnić tylko pierwszą kolumnę, która zawiera nazwę tabeli.

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"

Jednowarstwowy do prostego kopiowania / wklejania

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"
Natsimhan
źródło
-1

Aby zmienić kodowanie zestawu znaków na UTF-8, wykonaj proste kroki w PHPMyAdmin

  1. Wybierz swoją bazę danych SS

  2. Przejdź do operacji SS

  3. W zakładce operacji, w menu rozwijanym dolnego sortowania wybierz żądane kodowanie, tj. (Utf8_general_ci), a także zaznacz pole wyboru (1) zmień wszystkie układy tabel, (2) Zmień układy wszystkich kolumn tabel. i naciśnij Go.

SS

tread khuram
źródło