fix description

This commit is contained in:
2026-07-29 21:46:48 +03:30
parent e8651135d1
commit f921e97466
5 changed files with 60 additions and 7 deletions
@@ -13,9 +13,14 @@ return new class extends Migration
public function up(): void
{
if (Schema::hasTable('products') && ! Schema::hasColumn('products', 'description')) {
Schema::table('products', function ($table) {
$table->text('description')->nullable();
});
// charset صریح — روی سرورهای latin1-default، TEXT بدون charset فارسی را نمی‌پذیرد
DB::statement(
'ALTER TABLE `products` ADD COLUMN `description` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL'
);
} elseif (Schema::hasTable('products') && Schema::hasColumn('products', 'description')) {
DB::statement(
'ALTER TABLE `products` MODIFY COLUMN `description` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL'
);
}
if (! Schema::hasTable('settings')) {
@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
/**
* روی بعضی سرورها (DB default = latin1) ستون description بدون charset اضافه شده
* و ذخیرهٔ فارسی با خطای 3988 می‌خورد.
*/
return new class extends Migration
{
public function up(): void
{
if (! Schema::hasTable('products') || ! Schema::hasColumn('products', 'description')) {
return;
}
DB::statement(
'ALTER TABLE `products` MODIFY COLUMN `description` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL'
);
}
public function down(): void
{
// عمداً به latin1 برنمی‌گردیم
}
};
@@ -93,8 +93,8 @@ PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SET @sql = IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'products' AND COLUMN_NAME = 'description') = 0,
'ALTER TABLE `products` ADD COLUMN `description` TEXT NULL',
'SELECT ''skip products.description'' AS info'
'ALTER TABLE `products` ADD COLUMN `description` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL',
'ALTER TABLE `products` MODIFY COLUMN `description` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL'
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
@@ -0,0 +1,18 @@
-- ستون products.description روی بعضی سرورها latin1 است → فارسی ذخیره نمی‌شود (MySQL 3988)
-- idempotent — چند بار قابل اجرا
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
SET @db = DATABASE();
SET @sql = IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'products' AND COLUMN_NAME = 'description') = 0,
'ALTER TABLE `products` ADD COLUMN `description` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL',
'ALTER TABLE `products` MODIFY COLUMN `description` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL'
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
SELECT COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME, COLUMN_TYPE
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'products' AND COLUMN_NAME = 'description';
+4 -2
View File
@@ -7,11 +7,13 @@ START TRANSACTION;
SET @db = DATABASE();
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;
SET @sql = IF(
(SELECT COUNT(*) FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = @db AND TABLE_NAME = 'products' AND COLUMN_NAME = 'description') = 0,
'ALTER TABLE `products` ADD COLUMN `description` TEXT NULL',
'SELECT ''skip products.description'' AS info'
'ALTER TABLE `products` ADD COLUMN `description` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL',
'ALTER TABLE `products` MODIFY COLUMN `description` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL'
);
PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;