web-dev-qa-db-ja.com

データベース、テーブル、列の照合順序を変更するには?

データベースはlatin1_general_ciになりました。照合をutf8mb4_general_ciに変更したいと思います。

PhpMyAdminには、データベース、テーブル、列の照合順序を変更する設定がありますか?ひとつずつ変えるのではなく?

171
user158469

各テーブルを個別に変換する必要があります。

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 

(これにより列も変換されます)、またはデータベースをlatin1でエクスポートし、utf8mb4でインポートして戻します。

230
Quassnoi

OPが尋ねたように、私はここに貢献しています:

データベース、テーブル、列の照合順序を変更する方法?

選択された回答は、テーブルレベルで表示されます。


データベース全体の変更:

ALTER DATABASE <database_name> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

テーブルごとに変更:

ALTER TABLE <table_name> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

列に対しても変更するため、テーブルレベルで変更することをお勧めします。特定の列の変更は、特定のケースに対応しています。

特定の列の照合の変更:

ALTER TABLE <table_name> MODIFY <column_name> VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
144
Nabeel Ahmed

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!";
                ?>
63
hkasera

使用できるテーブルの照合を個別に変更するには、

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8

データベース全体にデフォルトの照合を設定するには、

ALTER DATABASE  `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

または、

Goto PhpMyAdmin-> Operations-> Collat​​ion。

そこには、既存のすべての照合を含む選択ボックスがあります。ここで、照合を変更できます。したがって、新しい列を作成している間、データベーステーブルはこの照合に従います。新しい列の作成中に照合を選択する必要はありません。

38
jeeva

次のクエリは、すべてのテーブルのすべての適切な列の照合順序を特定のタイプ(以下の例ではutf8_general_ci)に変更するALTERクエリを生成します。

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');
10
Parampal Pooni

いくつかのレベルでデフォルトの照合を設定できます。

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

1)クライアント2)サーバーのデフォルト3)データベースのデフォルト4)テーブルのデフォルト5)列

9
andersonbd1

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
9

驚いたので、ここに戻って報告しなければなりませんでした。優れた、よく管理されたインターコネクト/ IT SAFE SEARCH AND REPLACE ON DATABASEスクリプトには、テーブルをutf8/unicodeに変換するオプションがあり、さらにinnodbに変換するオプションもあります。これは、データベース駆動型Webサイト(Wordpress、Drupal、Joomlaなど)をあるドメインから別のドメインに移行するために一般的に使用されるスクリプトです。

interconnect script buttons

4
Adam Nofsinger

次のようにPHPスクリプトを使用して、すべてのテーブルのCHARSETとCOLLATIONを変更できます。 hkaseraの答えは好きですが、問題は、各テーブルでクエリが2回実行されることです。このコードは、mysqlの代わりにMySqliを使用し、二重クエリを防止することを除いて、ほぼ同じです。賛成票を投じることができたら、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();

?>
3
mtmehdi

このコードをスクリプトファイルに簡単に追加できます

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

ここでは、各テーブルを手動で変換する必要があることを読みましたが、そうではありません。ストアドプロシージャを使用してそれを行う方法を次に示します。

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

詳細については、こちらをご覧ください ブログ

3
András Ottó

スキーマのデフォルトの文字セットを更新する場合:

 ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;
2
Mircea Stanciu

このSQLを実行するだけです。 COLLATIONを必要なものとdatabaseNameに変更します。

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

次のシェルスクリプトを使用しました。データベース名をパラメーターとして受け取り、すべてのテーブルを別の文字セットと照合順序に変換します(別のパラメーターまたはスクリプトで定義された既定値によって与えられます)。

#!/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="$1"
CHARSET="$2"
COLL="$3"

[ -n "$DB" ] || exit 1
[ -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 | (
    while read TABLE; do
        echo $DB.$TABLE
        echo "ALTER TABLE $TABLE CONVERT TO CHARACTER SET $CHARSET COLLATE $COLL;" | mysql $DB
    done
)
1
Petr Stastny

簡単な方法-SQLファイルにエクスポートし、検索と置換を使用して、変更する必要があるテキストを変更します。新しいデータベースを作成し、データをインポートしてから、古いデータベースと新しいデータベースの名前を古い名前に変更します。

0
kickoff3pm

私の解決策は、@ 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>のすべてのテーブルを要求されたエンコードに変換するスクリプトが生成されます。これはevery column!のエンコーディングも変更します

0

特定のデータベース内のすべてのテーブルを検索し、それら(およびその列)を変換するbashスクリプトを作成しました。

スクリプトはここから入手できます: https://github.com/Juddling/mysql-charset

0
Juddling