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