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