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


답변:


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.