use*_*818 2 php mysql emoji laravel
我的MySQL DB排序规则是:utf8mb4_unicode_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 , 5edccab9327c4, challenge-55edccab9327e81591528121.png, 2, 0, ?, 5ec443a71e40b, 2020-06-07 11:08:41, 2020-06-07 11:08:41))
Run Code Online (Sandbox Code Playgroud)
这是我的控制器中的存储方法:
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');
}
Run Code Online (Sandbox Code Playgroud)
这更多的是数据库和迁移结束问题,然后在你的 Laravel 上,因为你收到了不正确的格式错误。请尝试:
1) 数据库:将数据库默认排序规则更改为utf8mb4. 看起来一切都完成了
2) 表:将表排序规则更改为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 查询编写更新表迁移脚本并运行 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');
}
}
Run Code Online (Sandbox Code Playgroud)
注意:您仍然需要将数据库配置保留为 utf8mb4
希望对你有帮助
--
如何修复错误代码:1833
外键字段和引用的类型和定义必须相同。这意味着您的外键不允许更改字段的类型。您想要做的是删除外键并在运行新查询后重新创建它。执行此操作时必须禁止写入数据库,否则,您将面临数据完整性问题的风险。
LOCK TABLES
user_challenges WRITE,
NAMEOFOTHERTABLE WRITE;
ALTER TABLE user_challenges
DROP FOREIGN KEY challenge_id,
Run Code Online (Sandbox Code Playgroud)
现在运行查询:
ALTER TABLE Tablename CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin
Run Code Online (Sandbox Code Playgroud)
重新创建外键:
ALTER TABLE user_challenges
ADD CONSTRAINT foreignkeyname FOREIGN KEY (challenge_id)
REFERENCES OTHERTABLE (challenge_id);
UNLOCK TABLES;
Run Code Online (Sandbox Code Playgroud)
我在上面添加了写锁^
除您自己的 ( INSERT, UPDATE, DELETE) 之外的任何其他会话中的所有写入查询都将等待超时或UNLOCK TABLES; 被执行
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
让我知道情况如何,或者如果您遇到任何错误,我尝试将其与您的情况相匹配,但您可能需要对命名约定进行一些调整
| 归档时间: |
|
| 查看次数: |
2898 次 |
| 最近记录: |