Как конвертировать мою таблицу из latin1_swedish_ci в utf8 [duplicate]

Это означает, что указанная переменная не указана ни на что. Я мог бы сгенерировать это так:

SqlConnection connection = null;
connection.Open();

Это вызовет ошибку, потому что, пока я объявил переменную «connection», она не указала ни на что. Когда я пытаюсь вызвать член «Open», для его устранения нет ссылки, и он будет вызывать ошибку.

Чтобы избежать этой ошибки:

  1. Всегда инициализируйте свои объекты, прежде чем пытаться что-либо с ними делать.
  2. Если вы не уверены, что объект имеет значение null, проверьте его с помощью object == null.

Инструмент Resharper JetBrains определит каждое место в вашем коде, которое имеет возможность ошибки нулевой ссылки, позволяя вам ввести нулевую проверку. Эта ошибка является источником ошибок номер один, IMHO.

375
задан Nanne 24 May 2011 в 20:14
поделиться

17 ответов

Используйте команды ALTER DATABASE и ALTER TABLE .

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

Или, если вы все еще используете MySQL 5.5.2 или старше, который не поддерживал 4-байтовый UTF-8, вместо utf8mb4 используйте utf8:

ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
574
ответ дан BalusC 24 August 2018 в 17:58
поделиться

alter table table_name charset = 'utf8';

Это простой запрос, который я смог использовать для своего случая, вы можете изменить имя_таблицы в соответствии с вашими требованиями.

0
ответ дан Aditya Seth 24 August 2018 в 17:58
поделиться

Вдохновленный комментарием @sdfor, вот скрипт bash, выполняющий задание

#!/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
5
ответ дан Camoflame 24 August 2018 в 17:58
поделиться

Для баз данных с большим количеством таблиц вы можете использовать простой скрипт php для обновления кодировки базы данных и всех таблиц, используя следующее:

$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>";
}
4
ответ дан Dan Lucas 24 August 2018 в 17:58
поделиться

Если вы не можете заставить ваши таблицы конвертироваться или ваша таблица всегда настроена на некоторый набор символов, отличных от utf8, но вы хотите использовать utf8, лучшим вариантом может быть уничтожить его и начать заново и явно указать:

create database database_name character set utf8;
1
ответ дан Don Cruickshank 24 August 2018 в 17:58
поделиться
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
ответ дан Evan Carslake 24 August 2018 в 17:58
поделиться

Если данные не находятся в одном наборе символов, вы можете рассмотреть этот фрагмент из http://dev.mysql.com/doc/refman/5.0/en/charset-conversion.html

Если столбец имеет недвоичный тип данных (CHAR, VARCHAR, TEXT), его содержимое должно быть закодировано в наборе символов столбца, а не в другом наборе символов. Если содержимое закодировано в другом наборе символов, вы можете преобразовать столбец, чтобы сначала использовать двоичный тип данных, а затем в недвоичный столбец с нужным набором символов.

Пример:

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

Убедитесь, что вы выбрали правильную сортировку, или вы можете получить уникальные ключевые конфликты. например Éleanore и Eleanore можно считать одинаковыми в некоторых сопоставлениях.

Кроме:

У меня была ситуация, когда некоторые символы «ломались» в письмах, даже если они были сохранены как UTF-8 в базы данных. Если вы отправляете электронные письма с использованием данных utf8, вы можете также конвертировать свои письма для отправки в UTF8.

В PHPMailer просто обновите эту строку: public $CharSet = 'utf-8';

4
ответ дан Frank Forte 24 August 2018 в 17:58
поделиться

В командной строке shell

Если вы один из командной строки, вы можете сделать это очень быстро. Просто заполните «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"

Однострочный для простой копирования / вставки

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"
70
ответ дан Jasny - Arnold Daniels 24 August 2018 в 17:58
поделиться

Используйте HeidiSQL . Его бесплатный и очень хороший инструмент db.

Из меню инструментов введите редактор Bulk table

Выберите полную базу данных или выберите таблицы для преобразования,

  • tick Изменить настройку по умолчанию: utf8mb4_general_ci
  • tick Преобразовать в кодировку: utf8

Выполнить

Это преобразует полную базу данных с латинского на utf8 только в несколько секунд.

Работает как шарм:)

HeidiSQL подключается по умолчанию как utf8, поэтому любые специальные символы теперь должны рассматриваться как символ (æ ø å), а не как закодированные, когда проверяя данные таблицы.

Реальная ошибка при переходе с латинского на utf8 заключается в том, чтобы pdo подключался к кодировке utf8. Если нет, вы получите данные мусора, вставленные в таблицу utf8, и вопросительные знаки повсюду на вашей веб-странице, заставляя вас думать, что данные таблицы не являются utf8 ...

7
ответ дан jmruc 24 August 2018 в 17:58
поделиться

Прежде чем продолжить, убедитесь, что вы выполнили полную резервную копию базы данных!

Шаг 1: Изменения уровня базы данных

  • Идентификация набора и набора символов вашей базы данных
    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%');
    
  • Фиксация сортировки для базы данных
    ALTER DATABASE databasename CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    

Шаг 2: Изменения уровня таблицы

  • Идентификация таблиц базы данных с помощью неправильный набор символов или сопоставление
    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%')
    
  • Настройка и сортировка столбцов столбцов

Захват верхнего sql-вывода и запуск. (например, следующий)

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; 

относятся к: https://confluence.atlassian.com/display/CONFKB/How+to+Fix+the+Collation+and+Character+Set+ из + а + MySQL + База данных

13
ответ дан Mohsen 24 August 2018 в 17:58
поделиться

Чтобы изменить кодировку набора символов в UTF-8 для самой базы данных, введите следующую команду в приглашении mysql>. Замените DBNAME именем базы данных:

ALTER DATABASE DBNAME CHARACTER SET utf8 COLLATE utf8_general_ci;
0
ответ дан Nyein Aung 24 August 2018 в 17:58
поделиться

Вы можете создать sql для обновления всех таблиц с помощью:

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;

Захватить вывод и запустить его.

Ответ Арнольда Дэниелса выше более изящный.

62
ответ дан sdfor 24 August 2018 в 17:58
поделиться

Самый безопасный способ состоит в том, чтобы сначала преобразовать столбцы в двоичный тип, а затем изменить его обратно на него с использованием требуемой кодировки.

Каждый тип столбца имеет свой двоичный тип, как показано ниже:

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

Например:

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

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

Я пробовал несколько таблиц latin1, и он сохранялся все диакритики.

Вы можете извлечь этот запрос для всех столбцов, которые делают это:

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

После того, как вы сделаете это во всех своих столбцах, вы сделаете это во всех таблицах:

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

Чтобы сгенерировать этот запрос для всей вашей таблицы, используйте следующий запрос:

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

И теперь, когда вы изменили все свои столбцы и таблицы, выполните то же самое в базе данных:

ALTER DATABASE [DATA_BASE_NAME] CHARSET = utf8mb4 COLLATE = utf8mb4_general_ci;
0
ответ дан Sinto 24 August 2018 в 17:58
поделиться

Единственное решение, которое сработало для меня: http://docs.moodle.org/23/en/Converting_your_MySQL_database_to_UTF8

Преобразование базы данных, содержащей таблицы

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
ответ дан utapyngo 24 August 2018 в 17:58
поделиться

Вы также можете использовать инструмент DB Navicat, что делает его более легким.

  • Siva.

Щелкните правой кнопкой мыши вашу базу данных & amp; выберите DB Properties & amp; Измените, как вы хотите, в Drop Down

-1
ответ дан Variable 24 August 2018 в 17:58
поделиться
  1. Создайте резервную копию!
  2. Затем вам нужно установить по умолчанию набор символов в базе данных. Это не преобразует существующие таблицы, а только устанавливает значения по умолчанию для вновь созданных таблиц.
    ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;
    
  3. Затем вам нужно будет преобразовать набор символов во все существующие таблицы и их столбцы. Это предполагает, что ваши текущие данные фактически находятся в текущем наборе символов. Если ваши столбцы настроены на один набор символов, но ваши данные действительно хранятся в другом, вам нужно будет проверить руководство MySQL о том, как с этим справиться.
    ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;
    
113
ответ дан wpp 24 August 2018 в 17:58
поделиться
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();
0
ответ дан 剑二十三 24 August 2018 в 17:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: