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

Php 如何使用Laravel在MySQL中插入表情符号?,php,mysql,laravel,emoji,Php,Mysql,Laravel,Emoji,我的MySQL数据库排序规则是:utf8mb4\u unicode\u ci,如下所示: 但是,当我尝试使用Laravel将其插入表中时,会抛出以下错误: SQLSTATE[22007]: Invalid datetime format: 1366 Incorrect string value: '\xF0\x9F\x98\x89' for column `challenges`.`challenges`.`description` at row 1 (SQL: insert into `ch

我的MySQL数据库排序规则是:utf8mb4\u unicode\u ci,如下所示:

但是,当我尝试使用Laravel将其插入表中时,会抛出以下错误:

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 This is more of a Database and migration end issue then on your laravel as you're getting an incorrect format error. Please try: 

1) Database: Change Database default collation as
utf8mb4
. Looks all done

2) Table: Change table collation as
CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
.

Query:

ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin

3) Code:

Run an insert query to get an intial test of being able to handle emoji
insert into tablename (columnname) values ''"

4) Set
utf8mb4
in database connection:

Use raw mysql query to write the update table migration script and run php artisan migrate command

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');
    }
}

SQLSTATE[22007]:无效的日期时间格式:1366不正确的字符串值:'\xF0\x9F\x98\x89'用于列'challenges`.'challenges`.'description`第1行(SQL:insert-into'challenges`、'hashtag`、'title`、'description`、'challenge\u id`、'image\u name`、'category\u id`、'duration`、'link`、'user\u id`、'updated\u at`)值(emojiasd,Emoji Test,嘿,这是一个Emoji这更像是一个数据库和迁移结束问题,然后在你的laravel上,因为你得到了一个不正确的格式错误。请尝试:

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

2) 表:将表排序规则更改为
字符集utf8mb4 COLLATE utf8mb4\u bin

查询:

ALTER TABLE Tablename转换为字符集utf8mb4 COLLATE utf8mb4\u bin

3) 代码:

运行insert查询以获得能够处理表情符号的初始测试
插入tablename(columnname)值“””

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

使用原始mysql查询编写更新表迁移脚本并运行php artisan migrate命令

LOCK TABLES 
user_challenges WRITE,
NAMEOFOTHERTABLE WRITE;

ALTER TABLE user_challenges
 DROP FOREIGN KEY challenge_id,
注意:您仍然必须将数据库配置保持为utf8mb4

希望这对你有帮助

--

如何修复错误代码:1833

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

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;
重新创建外键:

我在上面添加了一个写锁^

除了您自己的会话(
插入、更新、删除
)之外的任何其他会话中的所有写入查询都将等待超时或执行
解锁表


让我知道这是怎么回事,或者如果您遇到任何错误,我会尝试将其与您的案例相匹配,但您可能需要对命名约定进行一些调整

您的迁移是什么?看起来您忘记了并将属性类型
datetime
改为
string
@TalhaF。没有使用迁移,而是使用数据base是在MySQL Workbench中创建的-我已经用特定表的图像更新了帖子;@Joseph我认为类型很好,问题不在于日期时间,而在于表情符号和Unicode。@user13289818在迁移时您拼写错误,当我运行此查询时:ALTER TABLE挑战转换为字符集utf8mb4 COLLATE utf8mb4\u bin“由于外键-->错误代码:1833,我收到一个错误。无法更改列“challenge\u id”:在表“challenges.user\u challenges”的外键约束“user\u challenges\u fk1”中使用。如果有效,请确保选择该列作为正确答案,以防其他人遇到相同问题:)