将 Laravel MYSQL 更改为 utf8mb4 以支持现有数据库中的表情符号
Changing Laravel MYSQL to utf8mb4 for Emoji Support in Existing Database
我正在使用 Laravel 5.3 并且我已经设置了我的生产服务器。所有数据库迁移都已使用以下数据库配置创建:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
但是现在,我的一些用户报告说,他们在尝试保存其中包含表情符号图标的表单时遇到错误。搜索后我发现我需要将 mysql 字符集设置为 utf8mb4
才能正常工作,所以我的配置应该是这样的:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
由于这是在生产服务器中,我无法执行 migrate:refresh
。所以我的问题是:
- 如何更改我使用 laravel 迁移创建的现有数据库以使用
utf8mb4
而不是 utf8
并同时更新 laravel?有更简单的方法吗?
- 如果以上可行,我是最好为所有 table 设置
utf8mb4
还是仅将其用于我真正要使用表情符号的 2 table 列。
感谢您的帮助。
使用原始 mysql 查询编写更新 table 迁移脚本和 运行 php artisan migrate
命令
use Illuminate\Database\Migrations\Migration;
class UpdateTableCharset extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up() {
DB::unprepared('ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8mb4');
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down() {
DB::unprepared('ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8');
}
}
个人喜好,更新table。我没有证据说它更好
注意:您仍然必须将数据库配置保持为 utf8mb4
。
对于愿意在整个数据库上实现此目的的任何人,我发现自己需要这样的脚本:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Config;
class ChangeDbCharset extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$charset = "utf8mb4";
$collate = $charset."_unicode_ci";
$dbName = Config::get('database.connections.'.Config::get('database.default').'.database');
$query = "ALTER SCHEMA $dbName DEFAULT CHARACTER SET $charset DEFAULT COLLATE $collate;\n";
DB::connection()->getPdo()->exec($query);
$dbName = Config::get('database.connections.'.Config::get('database.default').'.database');
$result = DB::select(DB::raw('show tables'));
$test = DB::select(DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'varchar' AND TABLE_SCHEMA = '$dbName';"));
//var_dump($test);
foreach($test as $t)
{
$query = "ALTER TABLE $t->TABLE_NAME CHANGE $t->COLUMN_NAME $t->COLUMN_NAME VARCHAR(191) CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
$test = DB::select(DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'text' AND TABLE_SCHEMA = '$dbName';"));
foreach($test as $t)
{
$query = "ALTER TABLE $t->TABLE_NAME CHANGE $t->COLUMN_NAME $t->COLUMN_NAME TEXT CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
$result = DB::select(DB::raw('show tables'));
foreach($result as $r)
{
foreach($r as $k => $t)
{
$query = "ALTER TABLE `$t` CONVERT TO CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
}
echo "DB CHARSET set to $charset , $collate";
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
$charset = "utf8";
$collate = $charset."_unicode_ci";
$dbName = Config::get('database.connections.'.Config::get('database.default').'.database');
$query = "ALTER SCHEMA $dbName DEFAULT CHARACTER SET $charset DEFAULT COLLATE $collate;\n";
DB::connection()->getPdo()->exec($query);
$dbName = Config::get('database.connections.'.Config::get('database.default').'.database');
$result = DB::select(DB::raw('show tables'));
$test = DB::select(DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'varchar' AND TABLE_SCHEMA = '$dbName';"));
//var_dump($test);
foreach($test as $t)
{
$query = "ALTER TABLE $t->TABLE_NAME CHANGE $t->COLUMN_NAME $t->COLUMN_NAME VARCHAR(255) CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
$test = DB::select(DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'text' AND TABLE_SCHEMA = '$dbName';"));
foreach($test as $t)
{
$query = "ALTER TABLE $t->TABLE_NAME CHANGE $t->COLUMN_NAME $t->COLUMN_NAME TEXT CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
$result = DB::select(DB::raw('show tables'));
foreach($result as $r)
{
foreach($r as $k => $t)
{
$query = "ALTER TABLE `$t` CONVERT TO CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
}
echo "DB CHARSET set to $charset , $collate";
}
}
基于@insomniak-dev 的回答,但仅当 varchar 超出限制并用于索引时才会缩小 varchar。否则,它们会被转换,但大小保持原样。如果列将被收缩,它会检查是否有任何数据将被截断。
这也处理所有文本类型,并将每个 table 的所有转换批处理到单个语句中以提高速度。
Dryrun 标志输出可用 sql 而不是直接应用。
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$dryRun = true;
$this->convertDb('mysql', 'utf8mb4', 'utf8mb4_unicode_ci', $dryRun);
$this->convertDb('archive', 'utf8mb4', 'utf8mb4_unicode_ci', $dryRun);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
$dryRun = true;
$this->convertDb('archive', 'utf8', 'utf8_unicode_ci', $dryRun);
$this->convertDb('mysql', 'utf8', 'utf8_unicode_ci', $dryRun);
}
private function convertDb($connection, $charset, $collate, $dryRun)
{
$dbName = config("database.connections.{$connection}.database");
$varchars = \DB::connection($connection)
->select(\DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'varchar' and (CHARACTER_SET_NAME != '{$charset}' or COLLATION_NAME != '{$collate}') AND TABLE_SCHEMA = '{$dbName}'"));
// Check if shrinking field size will truncate!
$skip = []; // List of table.column that will be handled manually
$indexed = [];
if ($charset == 'utf8mb4') {
$error = false;
foreach($varchars as $t) {
if ($t->CHARACTER_MAXIMUM_LENGTH > 191) {
$key = "{$t->TABLE_NAME}.{$t->COLUMN_NAME}";
// Check if column is indexed
$index = \DB::connection($connection)
->select(\DB::raw("SHOW INDEX FROM `{$t->TABLE_NAME}` where column_name = '{$t->COLUMN_NAME}'"));
$indexed[$key] = count($index) ? true : false;
if (count($index)) {
$result = \DB::connection($connection)
->select(\DB::raw("select count(*) as `count` from `{$t->TABLE_NAME}` where length(`{$t->COLUMN_NAME}`) > 191"));
if ($result[0]->count > 0) {
echo "-- DATA TRUNCATION: {$t->TABLE_NAME}.{$t->COLUMN_NAME}({$t->CHARACTER_MAXIMUM_LENGTH}) => {$result[0]->count}" . PHP_EOL;
if (!in_array($key, $skip)) {
$error = true;
}
}
}
}
}
if ($error) {
throw new \Exception('Aborting due to data truncation');
}
}
$query = "SET FOREIGN_KEY_CHECKS = 0";
$this->dbExec($query, $dryRun, $connection);
$query = "ALTER SCHEMA {$dbName} DEFAULT CHARACTER SET {$charset} DEFAULT COLLATE {$collate}";
$this->dbExec($query, $dryRun, $connection);
$tableChanges = [];
foreach($varchars as $t) {
$key = "{$t->TABLE_NAME}.{$t->COLUMN_NAME}";
if (!in_array($key, $skip)) {
if ($charset == 'utf8mb4' && $t->CHARACTER_MAXIMUM_LENGTH > 191 && $indexed["{$t->TABLE_NAME}.{$t->COLUMN_NAME}"]) {
$tableChanges["{$t->TABLE_NAME}"][] = "CHANGE `{$t->COLUMN_NAME}` `{$t->COLUMN_NAME}` VARCHAR(191) CHARACTER SET {$charset} COLLATE {$collate}";
echo "-- Shrinking: {$t->TABLE_NAME}.{$t->COLUMN_NAME}({$t->CHARACTER_MAXIMUM_LENGTH})" . PHP_EOL;
} else if ($charset == 'utf8' && $t->CHARACTER_MAXIMUM_LENGTH == 191) {
$tableChanges["{$t->TABLE_NAME}"][] = "CHANGE `{$t->COLUMN_NAME}` `{$t->COLUMN_NAME}` VARCHAR(255) CHARACTER SET {$charset} COLLATE {$collate}";
echo "-- Expanding: {$t->TABLE_NAME}.{$t->COLUMN_NAME}({$t->CHARACTER_MAXIMUM_LENGTH})";
} else {
$tableChanges["{$t->TABLE_NAME}"][] = "CHANGE `{$t->COLUMN_NAME}` `{$t->COLUMN_NAME}` VARCHAR({$t->CHARACTER_MAXIMUM_LENGTH}) CHARACTER SET {$charset} COLLATE {$collate}";
}
}
}
$texts = \DB::connection($connection)
->select(\DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE like '%text%' and (CHARACTER_SET_NAME != '{$charset}' or COLLATION_NAME != '{$collate}') AND TABLE_SCHEMA = '{$dbName}'"));
foreach($texts as $t) {
$tableChanges["{$t->TABLE_NAME}"][] = "CHANGE `{$t->COLUMN_NAME}` `{$t->COLUMN_NAME}` {$t->DATA_TYPE} CHARACTER SET {$charset} COLLATE {$collate}";
}
$tables = \DB::connection($connection)
->select(\DB::raw("select * from INFORMATION_SCHEMA.TABLES where TABLE_COLLATION != '{$collate}' and TABLE_SCHEMA = '{$dbName}';"));
foreach($tables as $t) {
$tableChanges["{$t->TABLE_NAME}"][] = "CONVERT TO CHARACTER SET {$charset} COLLATE {$collate}";
$tableChanges["{$t->TABLE_NAME}"][] = "DEFAULT CHARACTER SET={$charset} COLLATE={$collate}";
}
foreach ($tableChanges as $table => $changes) {
$query = "ALTER TABLE `{$table}` ".implode(",\n", $changes);
$this->dbExec($query, $dryRun, $connection);
}
$query = "SET FOREIGN_KEY_CHECKS = 1";
$this->dbExec($query, $dryRun, $connection);
echo "-- {$dbName} CONVERTED TO {$charset}-{$collate}" . PHP_EOL;
}
private function dbExec($query, $dryRun, $connection)
{
if ($dryRun) {
echo $query . ';' . PHP_EOL;
} else {
\DB::connection($connection)->getPdo()->exec($query);
}
}
我正在使用 Laravel 5.3 并且我已经设置了我的生产服务器。所有数据库迁移都已使用以下数据库配置创建:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
但是现在,我的一些用户报告说,他们在尝试保存其中包含表情符号图标的表单时遇到错误。搜索后我发现我需要将 mysql 字符集设置为 utf8mb4
才能正常工作,所以我的配置应该是这样的:
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
由于这是在生产服务器中,我无法执行 migrate:refresh
。所以我的问题是:
- 如何更改我使用 laravel 迁移创建的现有数据库以使用
utf8mb4
而不是utf8
并同时更新 laravel?有更简单的方法吗? - 如果以上可行,我是最好为所有 table 设置
utf8mb4
还是仅将其用于我真正要使用表情符号的 2 table 列。
感谢您的帮助。
使用原始 mysql 查询编写更新 table 迁移脚本和 运行
php artisan migrate
命令use Illuminate\Database\Migrations\Migration; class UpdateTableCharset extends Migration { /** * Run the migrations. * * @return void */ public function up() { DB::unprepared('ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8mb4'); } /** * Reverse the migrations. * * @return void */ public function down() { DB::unprepared('ALTER TABLE `table_name` CONVERT TO CHARACTER SET utf8'); } }
个人喜好,更新table。我没有证据说它更好
注意:您仍然必须将数据库配置保持为 utf8mb4
。
对于愿意在整个数据库上实现此目的的任何人,我发现自己需要这样的脚本:
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Config;
class ChangeDbCharset extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$charset = "utf8mb4";
$collate = $charset."_unicode_ci";
$dbName = Config::get('database.connections.'.Config::get('database.default').'.database');
$query = "ALTER SCHEMA $dbName DEFAULT CHARACTER SET $charset DEFAULT COLLATE $collate;\n";
DB::connection()->getPdo()->exec($query);
$dbName = Config::get('database.connections.'.Config::get('database.default').'.database');
$result = DB::select(DB::raw('show tables'));
$test = DB::select(DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'varchar' AND TABLE_SCHEMA = '$dbName';"));
//var_dump($test);
foreach($test as $t)
{
$query = "ALTER TABLE $t->TABLE_NAME CHANGE $t->COLUMN_NAME $t->COLUMN_NAME VARCHAR(191) CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
$test = DB::select(DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'text' AND TABLE_SCHEMA = '$dbName';"));
foreach($test as $t)
{
$query = "ALTER TABLE $t->TABLE_NAME CHANGE $t->COLUMN_NAME $t->COLUMN_NAME TEXT CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
$result = DB::select(DB::raw('show tables'));
foreach($result as $r)
{
foreach($r as $k => $t)
{
$query = "ALTER TABLE `$t` CONVERT TO CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
}
echo "DB CHARSET set to $charset , $collate";
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
$charset = "utf8";
$collate = $charset."_unicode_ci";
$dbName = Config::get('database.connections.'.Config::get('database.default').'.database');
$query = "ALTER SCHEMA $dbName DEFAULT CHARACTER SET $charset DEFAULT COLLATE $collate;\n";
DB::connection()->getPdo()->exec($query);
$dbName = Config::get('database.connections.'.Config::get('database.default').'.database');
$result = DB::select(DB::raw('show tables'));
$test = DB::select(DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'varchar' AND TABLE_SCHEMA = '$dbName';"));
//var_dump($test);
foreach($test as $t)
{
$query = "ALTER TABLE $t->TABLE_NAME CHANGE $t->COLUMN_NAME $t->COLUMN_NAME VARCHAR(255) CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
$test = DB::select(DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'text' AND TABLE_SCHEMA = '$dbName';"));
foreach($test as $t)
{
$query = "ALTER TABLE $t->TABLE_NAME CHANGE $t->COLUMN_NAME $t->COLUMN_NAME TEXT CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
$result = DB::select(DB::raw('show tables'));
foreach($result as $r)
{
foreach($r as $k => $t)
{
$query = "ALTER TABLE `$t` CONVERT TO CHARACTER SET $charset COLLATE $collate; \n";
echo $query;
DB::connection()->getPdo()->exec($query);
}
}
echo "DB CHARSET set to $charset , $collate";
}
}
基于@insomniak-dev 的回答,但仅当 varchar 超出限制并用于索引时才会缩小 varchar。否则,它们会被转换,但大小保持原样。如果列将被收缩,它会检查是否有任何数据将被截断。
这也处理所有文本类型,并将每个 table 的所有转换批处理到单个语句中以提高速度。
Dryrun 标志输出可用 sql 而不是直接应用。
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$dryRun = true;
$this->convertDb('mysql', 'utf8mb4', 'utf8mb4_unicode_ci', $dryRun);
$this->convertDb('archive', 'utf8mb4', 'utf8mb4_unicode_ci', $dryRun);
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
$dryRun = true;
$this->convertDb('archive', 'utf8', 'utf8_unicode_ci', $dryRun);
$this->convertDb('mysql', 'utf8', 'utf8_unicode_ci', $dryRun);
}
private function convertDb($connection, $charset, $collate, $dryRun)
{
$dbName = config("database.connections.{$connection}.database");
$varchars = \DB::connection($connection)
->select(\DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'varchar' and (CHARACTER_SET_NAME != '{$charset}' or COLLATION_NAME != '{$collate}') AND TABLE_SCHEMA = '{$dbName}'"));
// Check if shrinking field size will truncate!
$skip = []; // List of table.column that will be handled manually
$indexed = [];
if ($charset == 'utf8mb4') {
$error = false;
foreach($varchars as $t) {
if ($t->CHARACTER_MAXIMUM_LENGTH > 191) {
$key = "{$t->TABLE_NAME}.{$t->COLUMN_NAME}";
// Check if column is indexed
$index = \DB::connection($connection)
->select(\DB::raw("SHOW INDEX FROM `{$t->TABLE_NAME}` where column_name = '{$t->COLUMN_NAME}'"));
$indexed[$key] = count($index) ? true : false;
if (count($index)) {
$result = \DB::connection($connection)
->select(\DB::raw("select count(*) as `count` from `{$t->TABLE_NAME}` where length(`{$t->COLUMN_NAME}`) > 191"));
if ($result[0]->count > 0) {
echo "-- DATA TRUNCATION: {$t->TABLE_NAME}.{$t->COLUMN_NAME}({$t->CHARACTER_MAXIMUM_LENGTH}) => {$result[0]->count}" . PHP_EOL;
if (!in_array($key, $skip)) {
$error = true;
}
}
}
}
}
if ($error) {
throw new \Exception('Aborting due to data truncation');
}
}
$query = "SET FOREIGN_KEY_CHECKS = 0";
$this->dbExec($query, $dryRun, $connection);
$query = "ALTER SCHEMA {$dbName} DEFAULT CHARACTER SET {$charset} DEFAULT COLLATE {$collate}";
$this->dbExec($query, $dryRun, $connection);
$tableChanges = [];
foreach($varchars as $t) {
$key = "{$t->TABLE_NAME}.{$t->COLUMN_NAME}";
if (!in_array($key, $skip)) {
if ($charset == 'utf8mb4' && $t->CHARACTER_MAXIMUM_LENGTH > 191 && $indexed["{$t->TABLE_NAME}.{$t->COLUMN_NAME}"]) {
$tableChanges["{$t->TABLE_NAME}"][] = "CHANGE `{$t->COLUMN_NAME}` `{$t->COLUMN_NAME}` VARCHAR(191) CHARACTER SET {$charset} COLLATE {$collate}";
echo "-- Shrinking: {$t->TABLE_NAME}.{$t->COLUMN_NAME}({$t->CHARACTER_MAXIMUM_LENGTH})" . PHP_EOL;
} else if ($charset == 'utf8' && $t->CHARACTER_MAXIMUM_LENGTH == 191) {
$tableChanges["{$t->TABLE_NAME}"][] = "CHANGE `{$t->COLUMN_NAME}` `{$t->COLUMN_NAME}` VARCHAR(255) CHARACTER SET {$charset} COLLATE {$collate}";
echo "-- Expanding: {$t->TABLE_NAME}.{$t->COLUMN_NAME}({$t->CHARACTER_MAXIMUM_LENGTH})";
} else {
$tableChanges["{$t->TABLE_NAME}"][] = "CHANGE `{$t->COLUMN_NAME}` `{$t->COLUMN_NAME}` VARCHAR({$t->CHARACTER_MAXIMUM_LENGTH}) CHARACTER SET {$charset} COLLATE {$collate}";
}
}
}
$texts = \DB::connection($connection)
->select(\DB::raw("select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE like '%text%' and (CHARACTER_SET_NAME != '{$charset}' or COLLATION_NAME != '{$collate}') AND TABLE_SCHEMA = '{$dbName}'"));
foreach($texts as $t) {
$tableChanges["{$t->TABLE_NAME}"][] = "CHANGE `{$t->COLUMN_NAME}` `{$t->COLUMN_NAME}` {$t->DATA_TYPE} CHARACTER SET {$charset} COLLATE {$collate}";
}
$tables = \DB::connection($connection)
->select(\DB::raw("select * from INFORMATION_SCHEMA.TABLES where TABLE_COLLATION != '{$collate}' and TABLE_SCHEMA = '{$dbName}';"));
foreach($tables as $t) {
$tableChanges["{$t->TABLE_NAME}"][] = "CONVERT TO CHARACTER SET {$charset} COLLATE {$collate}";
$tableChanges["{$t->TABLE_NAME}"][] = "DEFAULT CHARACTER SET={$charset} COLLATE={$collate}";
}
foreach ($tableChanges as $table => $changes) {
$query = "ALTER TABLE `{$table}` ".implode(",\n", $changes);
$this->dbExec($query, $dryRun, $connection);
}
$query = "SET FOREIGN_KEY_CHECKS = 1";
$this->dbExec($query, $dryRun, $connection);
echo "-- {$dbName} CONVERTED TO {$charset}-{$collate}" . PHP_EOL;
}
private function dbExec($query, $dryRun, $connection)
{
if ($dryRun) {
echo $query . ';' . PHP_EOL;
} else {
\DB::connection($connection)->getPdo()->exec($query);
}
}