본문으로 바로가기

 

1) utf8 문자셋(3바이트)을 utf8mb4 로  4바이트 문자셋으로 바꿔야한다.

2)정렬은 utf8_general_ci 가 아닌 utf8mb4_general_ci 혹은 utf8_unicode_ci 로 collation 해줘야.

3) MySQL 5.7이상 업그레이드 필요.

4)​ 카톡,네이버 구글 ,주소창 모두 이모지 문자가 먹힌다. gnu에서는 현재 물음표(?) 로 표시된다.

어떤것은 이모지문자후에 글자가 잘린다.

---------- 변환 시작 -----

1. DB 기본세팅 변경

ALTER TABLE `yourDBName`.`yourTableName` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

 

 

2. Table 변경 프로그램 가동한다. 

 

/**
 * Requires php >= 5.5
 *
 * This is a PHP port from: https://gist.github.com/njvack/6113127
 *
 *이것을 하기전에 백업하세요. mysqldump -h localhost -u root -pYourPW  yourDBName >  yourDbName_bakup.sql
 *
 * DB는  utf8 시작 입니다.
 *
 * $dsn = 'mysql:host=localhost;port=3306;charset=utf8';
 *
 *  한번만 실행하면 끝나는데.  에러나만 계속 새로고침 합니다.
 *
 * @author hollodotme *
 * @author derclops since 2019-07-01
 *         - convert the database to utf8mb4
 *         - convert all tables to utf8mb4
 *         - actually then also convert the data to utf8mb4

아래는 위에 저작자분이 만든것을 일부수정 ydb=YurDBName  넣어서 쓸수있게 하였고 lantin1 을  utf8로 하였음.

이소스를 my_cvt_utf8to_utf8mb4.php로저장했다면

http://localhost/my_cvt_utf8to_utf8mb4.php?ydb=YurDbName   이런식으로  실행합니다.

 */

 

<?php
/**
 * Requires php >= 5.5
 *
 * This is a PHP port from: https://gist.github.com/njvack/6113127
 *
 *이것을 하기전에 백업하세요. mysqldump -h localhost -u root -pYourPW  yourDBName >  yourDbName_bakup.sql
 *
 * DB는  utf8 시작 입니다.
 *
 * $dsn = 'mysql:host=localhost;port=3306;charset=utf8';
 *
 *  한번만 실행하면 끝나는데.  에러나만 계속 새로고침 합니다.
 *
 * @author hollodotme *
 * @author derclops since 2019-07-01
 *         - convert the database to utf8mb4
 *         - convert all tables to utf8mb4
 *         - actually then also convert the data to utf8mb4

아래는 위에 저작자분이 만든것을 일부수정 ydb=YurDBName  넣어서 쓸수있게 하였고 lantin1 을  utf8로 하였음.

이소스를 my_cvt_utf8to_utf8mb4.php로저장했다면

http://localhost/my_cvt_utf8to_utf8mb4.php?ydb=YurDbName   이런식으로  실행합니다.

 */

error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING );

$ydb=$_GET['ydb'];
if(!$ydb) {echo "<h1>ydb=</h1>"; exit ; }


$dsn      = 'mysql:host=localhost;port=3306;charset=utf8';
$user     = 'userid';
$password = 'password';
$options  = [
    \PDO::ATTR_CURSOR                   => \PDO::CURSOR_FWDONLY,
    \PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true,
    \PDO::MYSQL_ATTR_INIT_COMMAND       => "SET CHARACTER SET utf8",
];


header('Content-Type: text/plain; charset=utf-8');

$oDb = new \PDO( $dsn, $user, $password, $options );

$databasesToConvert = [ $ydb/** database3, ... */ ];
$typesToConvert     = [ 'char', 'varchar', 'tinytext', 'mediumtext', 'text', 'longtext' ];

foreach ( $databasesToConvert as $database )
{
    echo $database, ":\n";
    echo str_repeat( '=', strlen( $database ) + 1 ), "\n";

    $oDb->exec( "USE `{$database}`" );

    echo "converting database to correct locale too ... \n";

    $oDb->exec("ALTER DATABASE `{$database}` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci");


    $tablesStatement = $oDb->query( "SHOW TABLES" );
    while ( ($table = $tablesStatement->fetchColumn()) )
    {
        echo "Table: {$table}:\n";
        echo str_repeat( '-', strlen( $table ) + 8 ), "\n";

        $columnsToConvert = [ ];

        $columsStatement = $oDb->query( "DESCRIBE `{$table}`" );

        while ( ($tableInfo = $columsStatement->fetch( \PDO::FETCH_ASSOC )) )
        {
            $column = $tableInfo['Field'];
            echo ' * ' . $column . ': ' . $tableInfo['Type'];

            $type = preg_replace( "#\(\d+\)#", '', $tableInfo['Type'] );

            if ( in_array( $type, $typesToConvert ) )
            {
                echo " => must be converted\n";

                $columnsToConvert[] = $column;
            }
            else
            {
                echo " => not relevant\n";
            }
        }


        //convert table also!!!
        $convert = "ALTER TABLE `{$table}` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci";

        echo "\n", $convert, "\n";
        $oDb->exec( $convert );
        $databaseErrors = $oDb->errorInfo();
        if( !empty($databaseErrors[1]) ){
            echo "\n !!!!!!!!!!!!!!!!! ERROR OCCURED ".print_r($databaseErrors, true)." \n";
            exit;
        }


        if ( !empty($columnsToConvert) )
        {
            $converts = array_map(
                function ( $column )
                {
                    //return "`{$column}` = IFNULL(CONVERT(CAST(CONVERT(`{$column}` USING utf8) AS binary) USING utf8mb4),`{$column}`)";
                    return "`{$column}` = CONVERT(BINARY(CONVERT(`{$column}` USING utf8)) USING utf8mb4)";
                },
                $columnsToConvert
            );

            $query = "UPDATE IGNORE `{$table}` SET " . join( ', ', $converts );

            //alternative
            // UPDATE feedback SET reply = CONVERT(BINARY(CONVERT(reply USING utf8)) USING utf8mb4) WHERE feedback_id = 15015;


            echo "\n", $query, "\n";


            $oDb->exec( $query );

            $databaseErrors = $oDb->errorInfo();
            if( !empty($databaseErrors[1]) ){
                echo "\n !!!!!!!!!!!!!!!!! ERROR OCCURED ".print_r($databaseErrors, true)." \n";
                exit;
            }
        }

        echo "\n--\n";
    }

    echo "\n";
}
?>

 

2번 프로그램은 안에있는 데이터까지 안전하게 변환해서 옮겨주기때문에 중요한 역활을 해줍니다.

그냥 언어설정만 변경하게 되면 안에있는 내용들이 깨지기 때문에 손실되는 부분이 있다고 합니다.

 

 

 

출처: https://sir.kr/pg_tip/16691

 

그누보드에 이모지,이모티콘 가능하게 MySQL 5.7버전에 세팅방법 > SIR

<br/>euckr 에서 utf8넘어온후에 DB문자셋 변경할일 없을줄알았는데.. <br/> <br/>아래 그림은 이모지의 코드번호 캡춰화면이다  . <br/> <br/>이모티콘 그림을  문자로 만들어 놓은것으로 생각된다. <br/>

sir.kr