データベースはlatin1_general_ci
現在、照合順序を に変更したいと考えていますutf8mb4_general_ci
。
データベース、テーブル、列の照合を変更する PhpMyAdmin の設定はありますか? 一つ一つ変えるのではなく?
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;
各テーブルを個別に変換する必要があります。
ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4
(これにより、列も同様に変換されます)、またはでデータベースをエクスポートし、latin1
でインポートし直しutf8mb4
ます。
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- >Operations->Collation に移動します。
そこに、既存のすべての照合を含む選択ボックスがあります。ここで照合順序を変更できます。したがって、新しい列を作成している間、データベーステーブルはこの照合に従います。新しい列を作成するときに照合を選択する必要はありません。
次のクエリは、すべてのテーブルのすべての適切な列の照合を特定の型 (以下の例では 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');
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
デフォルトの照合をいくつかのレベルで設定できます。
http://dev.mysql.com/doc/refman/5.0/en/charset-syntax.html
1)クライアント2)サーバーのデフォルト3)データベースのデフォルト4)テーブルのデフォルト5)列
この 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";
私は驚いたので、ここに戻って報告する必要がありました.Interconnect/it SAFE SEARCH AND REPLACE ON DATABASEスクリプトには、テーブルをutf8 / unicodeに変換するオプション、さらにはinnodbに変換するオプションがいくつかあります。 . これは、データベース駆動型の Web サイト (Wordpress、Drupal、Joomla など) をあるドメインから別のドメインに移行するために一般的に使用されるスクリプトです。
ここで、各テーブルを手動で変換する必要があることを読みましたが、そうではありません。ストアドプロシージャでそれを行う方法は次のとおりです。
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');
詳細については、このブログを参照してください。
簡単な方法 - SQL ファイルにエクスポートし、検索と置換を使用して、変更する必要があるテキストを変更します。新しいデータベースを作成し、データをインポートしてから、古いデータベースと新しいデータベースの名前を古い名前に変更します。