데이터베이스, 테이블, 열의 데이터 정렬을 변경하는 방법은 무엇입니까?


답변:


257

각 테이블을 개별적으로 변환해야합니다.

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8mb4 

(이것도 열을 변환합니다) 또는로 데이터베이스를 latin1내보내고로 가져옵니다 utf8mb4.


15
그러나 열의 데이터 정렬을 변경하고 싶습니다. 이것은 테이블 데이터 정렬 만 변경합니다.
user158469

7
@rsensan: CONVERT열의 데이터 정렬도 변경됩니다.
Quassnoi

21
ALTER SCHEMA database DEFAULT CHARACTER SET utf8 기본 컬렉션 utf8_general_ci;
stormwild

8
@stormwild : 기존 테이블에는 영향을 미치지 않습니다
Quassnoi

47
내 쿼리 : ALTER TABLE MYTABLECHARACTER SET로 변환 utf8mb4 COLLATE utf8mb4_unicode_ci; 더 이상 utf8_general_ci를 사용하지 마십시오 ;-)
Kapitein Witbaard

209

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;

15
이것은 실제로 질문에 직접 대답합니다. 테이블 수준 변경으로 인해 열이 업데이트되지 않았기 때문에 이것이 필요했습니다. 나중에 조사하겠습니다. 그러나 이것은 어려운시기를 극복 한 정보입니다. 감사.
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');
William Entriken

단일 컬럼의 경우 다음을 수행 할 수 있습니다. 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!";
                ?>

43

사용할 수있는 테이블의 데이터 정렬을 개별적으로 변경하려면

ALTER TABLE mytable CONVERT TO CHARACTER SET utf8

전체 데이터베이스에 대한 기본 데이터 정렬을 설정하려면

ALTER DATABASE  `databasename` DEFAULT CHARACTER SET utf8 COLLATE utf8_bin

그렇지 않으면,

고토 PhpMyAdmin-> Operations (작업)> 정렬.

거기에 모든 기존 데이터 정렬이 포함 된 선택 상자가 있습니다. 여기에서 데이터 정렬을 변경할 수 있습니다. 따라서 여기에 데이터베이스 테이블 뒤에 새 열을 만드는 동안이 데이터 정렬이 이어집니다. 새 열을 만드는 동안 선택 데이터 정렬이 필요하지 않습니다.


정말 감사합니다, 이것은 도움이되었습니다
JoZ3

15

다음 쿼리는 모든 테이블의 모든 해당 열에 대한 데이터 정렬을 특정 유형으로 변경하는 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');

+1이 답변이 가장 마음에 듭니다. 모두가 어딘가에 PHP를 가지고있는 것은 아닙니다. 일부 사용은 MySQL에서 다른 언어를 사용합니다. 이것은 MySQL Workbench에서 실행하고 행을 복사하여 붙여 넣기가 쉬웠습니다. 난 단지에 대한 위의를 실행하려면 추가 단계 한 information_schema.tables및 CONCAT의 코드ALTER TABLE 'schema'.'table' CHARACTER SET = utf8mb4 , COLLATE = utf8mb4_bin ;
피에르

1
이 문제는 (중 / 장) 텍스트 열 유형에 버그가 있으며 수동으로 정리해야합니다
stiebrs

11

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


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

4

다음과 같이 PHP 스크립트를 통해 모든 테이블의 CHARSET 및 COLLATION을 변경할 수 있습니다. 나는 hkasera의 대답을 좋아하지만 문제는 각 테이블에서 쿼리가 두 번 실행된다는 것입니다. 이 코드는 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();

?>

이것은 내가 변경된 말을 Zabbix 5 단지로 업그레이드 한 후 완벽하게 나를 위해 일한 캐릭터 세트데이터 정렬 이 같은을 : 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!";

4

나는 놀랐고, 그래서 여기에 와서보고 좋았으며, 훌륭하고 잘 관리 된 Interconnect / it SAFE SEARCH AND REPLACE ON DATABASE 스크립트에는 테이블을 utf8 / 유니 코드로 변환하고 심지어는 innodb로 변환하는 옵션이 있습니다 . 데이터베이스 기반 웹 사이트 (Wordpress, Drupal, Joomla 등)를 한 도메인에서 다른 도메인으로 마이그레이션하는 데 일반적으로 사용되는 스크립트입니다.

상호 연결 스크립트 버튼


3

여기에서 읽었습니다. 각 테이블을 수동으로 변환해야하지만 사실이 아닙니다. 저장 프로 시저로 수행하는 방법은 다음과 같습니다.

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

자세한 내용은이 블로그 를 참조하십시오 .


2

스키마에서 기본 문자 집합을 업데이트하려는 경우 :

 ALTER SCHEMA MYSCHEMA DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_unicode_ci;

1

다음 쉘 스크립트를 사용했습니다. 데이터베이스 이름을 매개 변수로 사용하고 모든 테이블을 다른 문자 세트 및 데이터 정렬로 변환합니다 (스크립트에 정의 된 다른 매개 변수 또는 기본값으로 제공됨).

#!/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

내 솔루션은 @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>요청한 인코딩으로 변환합니다 . 이것은 또한 모든 열의 인코딩을 변경합니다 !


1

SQL 요청으로 SQL 스크립트를 생성하는 더 나은 변형입니다. 기본값 / 널을 망치지 않습니다.

SELECT concat
    (
        'ALTER TABLE ', 
            t1.TABLE_SCHEMA, 
            '.', 
            t1.table_name, 
            ' MODIFY ', 
            t1.column_name, 
            ' ', 
            t1.column_type,
            ' CHARACTER SET utf8 COLLATE utf8_general_ci',
            if(t1.is_nullable='YES', ' NULL', ' NOT NULL'),
            if(t1.column_default is not null, concat(' DEFAULT \'', t1.column_default, '\''), ''),
            ';'
    )
from 
    information_schema.columns t1
where 
    t1.TABLE_SCHEMA like 'your_table_here' AND
    t1.COLLATION_NAME IS NOT NULL AND
    t1.COLLATION_NAME NOT IN ('utf8_general_ci');

0

빠른 방법-SQL 파일로 내보내기, 검색 및 바꾸기를 사용하여 변경해야하는 텍스트를 변경하십시오. 새 데이터베이스를 만들고 데이터를 가져온 다음 이전 데이터베이스와 새 데이터베이스의 이름을 이전 이름으로 바꿉니다.


0

데이터베이스의 모든 테이블에있는 모든 필드의 데이터 정렬을 한 번에 변경하려면 다음을 수행하십시오.

언급하기 전에 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 in table

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

?>}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.