如何使用 Laravel 在 MySQL 中插入表情符号?

How to insert emojis in MySQL using Laravel?

我的MySQL数据库排序规则是:utf8mb4_unicode_ci如下图:

然而,当我尝试使用 Laravel 将其插入 table 时 - 它会抛出以下错误:

SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: '\xF0\x9F\x98\x89' for column `challenges`.`challenges`.`description` at row 1 (SQL: insert into `challenges` (`hashtag`, `title`, `description`, `challenge_id`, `image_name`, `category_id`, `duration`, `link`, `user_id`, `updated_at`, `created_at`) values (emojiasd, Emoji Test, Hey this is an emoji , 5edccab9327c4, challenge-55edccab9327e81591528121.png, 2, 0, ?, 5ec443a71e40b, 2020-06-07 11:08:41, 2020-06-07 11:08:41))

这是我控制器中的存储方法:

public function store(Request $request)
    {
        //
        $this->validate($request, [
            'hashtag' => 'required',
            'title' => 'required',
            'description' => 'required',
            'category' => 'required',
            'image' => 'required|image|mimes:jpeg,png,jpg|max:2048',
            'duration' => 'required'
        ]);

        $challenge = new Challenge;
        $replace = array (' ', '#');
        $challenge->hashtag = strtolower(str_replace($replace, '', $request->input('hashtag')));
        $challenge->title = $request->input('title');
        $challenge->description = $request->input('description');
        $challenge->challenge_id = uniqid();

        $image = $request->file('image');
        $imageName = 'challenge-' . uniqid(5) . time() . '.' . $image->extension();
        $image->move(storage_path('app/public/challenges/'), $imageName);

        $challenge->image_name = $imageName;
        $challenge->category_id = $request->input('category');
        if ($request->input('duration') == 1) {
            $challenge->duration = $request->input('duration_days');
        } else {
            $challenge->duration = 0;
        }
        $challenge->link = $request->input('link');
        $challenge->user_id = Auth::id();
        $challenge->save();

        return redirect('/')->with('success', 'Challenge Created');
    }

更新 这是 challenges table 配置的图片:

这更像是一个数据库和迁移结束问题,然后是您的 laravel,因为您遇到了不正确的格式错误。请尝试:

1) 数据库:将数据库默认排序规则更改为 utf8mb4。看起来都完成了

2) Table:将 table 排序规则更改为 CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

查询:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3)代码:

运行 插入查询以获得能够处理表情符号的初步测试 insert into tablename (columnname) values ''"

4) 在数据库连接中设置utf8mb4:

使用原始 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');
    }
}

注意:您仍然需要将数据库配置保留为 utf8mb4

希望对您有所帮助

--

如何修复错误代码:1833

外键字段和引用的类型和定义必须相同。这意味着您的外键不允许更改您的字段类型。您要做的是删除外键并在 运行 新查询后重新创建它。在执行此操作时,您必须禁止写入数据库,否则,您将面临数据完整性问题的风险。

LOCK TABLES 
user_challenges WRITE,
NAMEOFOTHERTABLE WRITE;

ALTER TABLE user_challenges
 DROP FOREIGN KEY challenge_id,

现在运行查询:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

重新创建外键:

ALTER TABLE user_challenges
    ADD CONSTRAINT foreignkeyname FOREIGN KEY (challenge_id)
          REFERENCES OTHERTABLE (challenge_id);

UNLOCK TABLES;

我在上面加了写锁^

除了您自己的 (INSERT, UPDATE, DELETE) 之外的任何其他会话中的所有写入查询都将等到超时或 UNLOCK TABLES;被执行

http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html

让我知道进展如何,或者如果您遇到任何错误,我尝试将其与您的情况相匹配,但您可能需要对命名约定进行一些调整