Как изменить параметры сортировки базы данных, таблицы, столбца?
Выбранный ответ просто утверждает его на уровне таблицы.
Изменяя всю базу данных:
ALTERDATABASE<database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Изменяя это за столом:
ALTERTABLE<table_name>CONVERTTO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Хорошей практикой является изменение его на уровне таблицы, поскольку это также изменит и для столбцов. Изменение для конкретного столбца для любого конкретного случая.
Изменение параметров сортировки для определенного столбца:
ALTERTABLE<table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Этот на самом деле отвечает на вопрос напрямую. Мне это нужно, так как мои изменения на уровне таблицы НЕ обновляли столбцы. Я исследую это позже; но это информация, которая пережила меня в трудные времена. Спасибо.
Parapluie
9
Лучший ответ на это.
jubi4dition
Да, вам нужны особенности типа столбца. Вот волшебная команда, чтобы получить все типы. Используя многострочное редактирование, вы можете сгенерировать команду для одновременного обновления всех столбцов, начиная с: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');
Уильям Энтрикен,
Для одного столбца вы можете просто сделать: ALTER TABLE table_name CHANGE column_name VARCHAR (45) COLLATE utf8mb4_bin;
TomoMiha
68
Вы можете запустить скрипт php.
<?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!";?>
Там вы найдете поле выбора, которое содержит все существующие сопоставления. Так что здесь вы можете изменить свое сопоставление. Таким образом, здесь после таблицы базы данных будет следовать этому сопоставлению при создании нового столбца. Нет необходимости выбирать сопоставление при создании новых столбцов.
Следующий запрос сгенерирует запросы ALTER, которые изменят параметры сортировки для всех соответствующих столбцов во всех таблицах на определенный тип (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 ISNOTNULLAND
t1.COLLATION_NAME NOTIN('utf8_general_ci');
+1 Мне больше нравится этот ответ. Не у всех где-то есть магический PHP. Некоторые из них используют другие языки с MySQL. Это было легко запустить в MySQL Workbench, скопировать строки и вставить. Я только что сделал дополнительный шаг для запуска вышеприведенного information_schema.tablesкода и кода в concatALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Pierre
1
Это
приводит к
11
Если вы запустите phpMyAdmin >> выберите базу данных >> выберите таблицу >> перейдите на вкладку «Операции» >> в разделе «Параметры таблицы» >> вы можете выбрать Collation из выпадающего списка >> и после нажатия {Go} на В верхней части экрана вы увидите сообщение:
Ваш SQL-запрос был успешно выполнен
и сценарий
ALTERTABLE`tableName`CONVERTTO CHARACTER SET utf8 COLLATE utf8_general_ci
Но это НЕ изменит сопоставления существующих столбцов. Для этого вы можете использовать этот скрипт (этот также пришел из phpMyAdmin)
ALTERTABLE`tableName` CHANGE `Name``Name` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOTNULL
Вы можете изменить CHARSET и COLLATION всех ваших таблиц через скрипт PHP следующим образом. Мне нравится ответ hkasera, но проблема в том, что запрос выполняется дважды для каждой таблицы. Этот код почти такой же, за исключением использования MySqli вместо mysql и предотвращения двойных запросов. Если бы я мог проголосовать, я бы проголосовал за ответ hkasera.
<?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();?>
Это работает для меня идеально, после обновления до Zabbix 5. Просто чтобы сказать , что я изменил Charset и параметры сортировки , как это: CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin.
robe007
4
Вы можете просто добавить этот код в файл скрипта
//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!";
Я был удивлен, узнав, и поэтому мне пришлось вернуться сюда и сообщить, что отличный и ухоженный скрипт Interconnect / it Safe SEARCH AND REPLACE ON DATABASE имеет некоторые опции для преобразования таблиц в utf8 / unicode и даже для преобразования в innodb , Этот скрипт обычно используется для переноса сайта, управляемого базой данных (Wordpress, Drupal, Joomla и т. Д.), Из одного домена в другой.
Я читал здесь, что вам нужно конвертировать каждую таблицу вручную, это неправда. Вот решение, как сделать это с помощью хранимой процедуры:
DELIMITER $$DROPPROCEDUREIFEXISTS changeCollation$$-- character_set parameter could be 'utf8'-- or 'latin1' or any other valid character setCREATEPROCEDURE changeCollation(IN character_set VARCHAR(255))BEGINDECLARE v_finished INTEGER DEFAULT0;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 parameterDECLARE alter_cursor CURSORFORSELECTDISTINCT TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA =DATABASE()AND COLLATION_NAME NOTLIKE CONCAT(character_set,'_%');-- This handler will set the value v_finished to 1-- if there are no more rowsDECLARECONTINUE HANDLER
FORNOT 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 oneFETCH alter_cursor INTO v_table_name;-- If there is no more record, then we have to skip-- the commands inside the loopIF v_finished =1THEN
LEAVE get_table;ENDIF;IF v_table_name !=''THENIF v_message ='No records'THENSET v_message ='';ENDIF;-- 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 loopSET@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 ='';ENDIF;-- Close the loop and the cursorEND LOOP get_table;CLOSE alter_cursor;-- Returns information about the altered tables or 'No records'SELECT v_message;END$$
DELIMITER ;
После того, как процедура создана, вызовите ее просто:
CALL changeCollation('utf8');
Для более подробной информации читайте этот блог .
Я использовал следующий сценарий оболочки. Он принимает имя базы данных в качестве параметра и преобразует все таблицы в другой набор символов и параметры сортировки (заданные другими параметрами или значением по умолчанию, определенным в сценарии).
#!/bin/bash
# mycollate.sh <database>[<charset><collation>]# changes MySQL/MariaDB charset and collation for one database-all tables and#all columns inall tables
DB="$1"
CHARSET="$2"
COLL="$3"[-n "$DB"]||exit1[-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 |(whilereadTABLE; do
echo $DB.$TABLE
echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;"| mysql $DB
done
)
Мое решение - это сочетание @Dzintars и @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";
С помощью CONVERT TOэтого генерируется сценарий, который преобразует все таблицы <your-database>в требуемую кодировку. Это также меняет кодировку каждого столбца !
Быстрый способ - экспортируйте в файл SQL, используйте поиск и замену, чтобы изменить текст, который нужно изменить. Создайте новую базу данных, импортируйте данные, а затем переименуйте старую базу данных и новую в старое имя.
Чтобы изменить параметры сортировки всех полей во всех таблицах базы данных одновременно:
Я просто добавил еще один цикл для полей в таблицах к решению через Php, как уже упоминалось. Это помогло, все поля в таблицах также конвертированы.
<?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 intable$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!";?>}
Ответы:
Вам нужно либо преобразовать каждую таблицу в отдельности:
(это также преобразует столбцы) или экспортирует базу данных с помощью
latin1
и импортирует ее обратноutf8mb4
.источник
@rsensan
:CONVERT
также изменит сортировку столбцов.database
DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;MYTABLE
CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; Пожалуйста, не используйте utf8_general_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');
Вы можете запустить скрипт php.
источник
Чтобы изменить параметры сортировки для таблиц по отдельности, вы можете использовать,
Чтобы установить параметры сортировки по умолчанию для всей базы данных,
или еще,
Goto PhpMyAdmin-> осуществление операций> Упорядочение.
Там вы найдете поле выбора, которое содержит все существующие сопоставления. Так что здесь вы можете изменить свое сопоставление. Таким образом, здесь после таблицы базы данных будет следовать этому сопоставлению при создании нового столбца. Нет необходимости выбирать сопоставление при создании новых столбцов.
источник
Следующий запрос сгенерирует запросы ALTER, которые изменят параметры сортировки для всех соответствующих столбцов во всех таблицах на определенный тип (utf8_general_ci в моем примере ниже).
источник
information_schema.tables
кода и кода в concatALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
Если вы запустите phpMyAdmin >> выберите базу данных >> выберите таблицу >> перейдите на вкладку «Операции» >> в разделе «Параметры таблицы» >> вы можете выбрать Collation из выпадающего списка >> и после нажатия {Go} на В верхней части экрана вы увидите сообщение:
и сценарий
Но это НЕ изменит сопоставления существующих столбцов. Для этого вы можете использовать этот скрипт (этот также пришел из phpMyAdmin)
источник
Вы можете установить параметры сортировки по умолчанию на нескольких уровнях:
http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
1) клиент 2) сервер по умолчанию 3) база данных по умолчанию 4) таблица по умолчанию 5) столбец
источник
Просто запустите этот SQL, чтобы преобразовать все таблицы базы данных одновременно. Измените COLLATION и databaseName на то, что вам нужно.
источник
Вы можете изменить CHARSET и COLLATION всех ваших таблиц через скрипт PHP следующим образом. Мне нравится ответ hkasera, но проблема в том, что запрос выполняется дважды для каждой таблицы. Этот код почти такой же, за исключением использования MySqli вместо mysql и предотвращения двойных запросов. Если бы я мог проголосовать, я бы проголосовал за ответ hkasera.
источник
CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin
.Вы можете просто добавить этот код в файл скрипта
источник
Я был удивлен, узнав, и поэтому мне пришлось вернуться сюда и сообщить, что отличный и ухоженный скрипт Interconnect / it Safe SEARCH AND REPLACE ON DATABASE имеет некоторые опции для преобразования таблиц в utf8 / unicode и даже для преобразования в innodb , Этот скрипт обычно используется для переноса сайта, управляемого базой данных (Wordpress, Drupal, Joomla и т. Д.), Из одного домена в другой.
источник
Я читал здесь, что вам нужно конвертировать каждую таблицу вручную, это неправда. Вот решение, как сделать это с помощью хранимой процедуры:
После того, как процедура создана, вызовите ее просто:
Для более подробной информации читайте этот блог .
источник
если вы хотите обновить кодировку по умолчанию в схеме:
источник
Я использовал следующий сценарий оболочки. Он принимает имя базы данных в качестве параметра и преобразует все таблицы в другой набор символов и параметры сортировки (заданные другими параметрами или значением по умолчанию, определенным в сценарии).
источник
Мое решение - это сочетание @Dzintars и @Quassnoi Answer.
С помощью
CONVERT TO
этого генерируется сценарий, который преобразует все таблицы<your-database>
в требуемую кодировку. Это также меняет кодировку каждого столбца !источник
Лучший вариант для генерации скрипта SQL по запросу SQL. Это не разрушит значения по умолчанию / нули.
источник
Быстрый способ - экспортируйте в файл SQL, используйте поиск и замену, чтобы изменить текст, который нужно изменить. Создайте новую базу данных, импортируйте данные, а затем переименуйте старую базу данных и новую в старое имя.
источник
Чтобы изменить параметры сортировки всех полей во всех таблицах базы данных одновременно:
Я просто добавил еще один цикл для полей в таблицах к решению через Php, как уже упоминалось. Это помогло, все поля в таблицах также конвертированы.
источник
Я только что написал скрипт bash, чтобы найти все таблицы в данной базе данных и скрыть их (и их столбцы).
Сценарий доступен здесь: https://github.com/Juddling/mysql-charset
источник