Как изменить параметры сортировки базы данных, таблицы, столбца?



теперь база данных latin1_general_ci и я хочу, чтобы изменить параметры сортировки на utf8_general_ci. Есть ли какие-либо настройки в PhpMyAdmin для изменения параметров сортировки базы данных, таблицы, столбца? Вместо того, чтобы менять один за другим?

653   15  

15 ответов:

вам нужно либо конвертировать каждую таблицу по отдельности:

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8 

(Это также преобразует столбцы) или экспортирует базу данных с помощью latin1 и импортировать его обратно с utf8.

Я вношу свой вклад здесь, как ОП спросил:

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

выбранный ответ просто указывает его на уровне таблицы.


изменение базы данных в целом:

ALTER DATABASE <database_name> CHARACTER SET utf8 COLLATE utf8_unicode_ci;

изменение его в таблице:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

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

Изменение параметров сортировки для определенного столбца:

ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_unicode_ci;

вы можете запустить 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 TABLE mytable CONVERT TO CHARACTER SET utf8

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

ALTER DATABASE  `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

или

перейти PhpMyAdmin - > Операции - >Параметры Сортировки.

там вы найдете поле выбора, которое содержит все исходящие параметры сортировки. Так что здесь вы можете изменить свои параметры сортировки. Так вот после того, как таблица базы данных будет следовать этой сортировки при создании нового столбца . Нет необходимости выберите параметры сортировки при создании новых столбцов.

вы можете установить параметры сортировки по умолчанию на нескольких уровнях:

http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html

1) клиент 2) по умолчанию сервер 3) базы данных по умолчанию 4) по умолчанию таблица 5 колонна)

Если вы запустите phpMyAdmin > > выберите базу данных > > выберите таблицу > > перейдите на вкладку "Операции" > > в разделе" параметры таблицы " > > вы можете выбрать параметры сортировки из выпадающего списка >> и как только вы нажмете {Go} в верхней части экрана вы увидите сообщение:

ваш SQL-запрос был успешно выполнен

и скрипт

ALTER TABLE `tableName` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci 

но это не изменит параметры сортировки существующих столбцов. Для этого вы можете использовать этот скрипт (этот также пришел из phpMyAdmin)

ALTER TABLE  `tableName` CHANGE  `Name`  `Name` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

следующий запрос будет генерировать запросы 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 IS NOT NULL AND
    t1.COLLATION_NAME NOT IN ('utf8_general_ci');

Я был удивлен, узнав, и поэтому мне пришлось вернуться сюда и сообщить, что отличный и хорошо поддерживаемый Interconnect/IT SAFE SEARCH and REPLACE on DATABASE script имеет некоторые возможности для преобразования таблиц в utf8 / unicode и даже для преобразования в innodb. Это скрипт, обычно используемый для переноса веб-сайта, управляемого базой данных (Wordpress, Drupal, Joomla и т. д.) Из одного домена в другой другой.

interconnect script buttons

вы можете изменить кодировку и параметры сортировки всех ваших таблиц с помощью 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 utf8 COLLATE utf8_unicode_ci") or die($conn1->error);
}
echo "The collation of your database has been successfully changed!";

$res->free();
$conn1->close();

?>

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

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 ;

после создания процедуры вызовите ее просто:

CALL changeCollation('utf8’);

для более подробной информации прочитайте эту блог.

вы можете просто добавить этот код в файл скрипта

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

Если вы хотите обновить кодировку по умолчанию на схему:

 ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;

я использовал следующий скрипт. Он принимает имя базы данных в качестве параметра и преобразует все таблицы в другую кодировку и параметры сортировки (заданные другими параметрами или значением по умолчанию, определенным в скрипте).

#!/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=""
CHARSET=""
COLL=""

[ -n "$DB" ] || exit 1
[ -n "$CHARSET" ] || CHARSET="utf8"
[ -n "$COLL" ] || COLL="utf8_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
)

быстрый способ-экспорт в файл SQL, используйте поиск и замену, чтобы изменить текст, который вам нужно изменить. Создайте новую базу данных, импортируйте данные, а затем переименуйте старую базу данных и новую базу данных в старое имя.

просто запустите этот SQL. Измените параметры сортировки на то, что вам нужно, и имя базы данных.

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

Comments

    Ничего не найдено.