Laravel Sail CLI调用MySQL时如何传递字符集参数解决乱码?
解决Laravel Sail MySQL CLI UTF8MB4乱码及表格错位问题的简便方法
下面是几种比直接使用冗长docker exec命令更简便的方案:
方案1:修改Sail的MySQL容器默认配置
直接在项目根目录的docker-compose.yml中,给MySQL服务添加默认字符集参数,这样每次启动容器后,所有客户端连接都会自动使用utf8mb4:
services: mysql: image: 'mysql/mysql-server:8.0' # 添加以下command配置,覆盖或追加默认启动参数 command: --default-character-set=utf8mb4 --collation-server=utf8mb4_unicode_ci # 保留原有其他配置(environment、ports、volumes等)
修改后执行sail down && sail up -d重启容器,之后直接使用sail mysql或sail artisan db连接时,非ASCII字符会正常显示,且表格不会错位。
方案2:添加Shell别名
把常用的docker exec命令封装成Shell别名,避免每次输入冗长命令:
- 打开你的Shell配置文件(比如Bash的
~/.bashrc或Zsh的~/.zshrc) - 添加以下别名(替换成你自己的容器名、数据库用户名、密码和库名):
alias sail-mysql='docker exec -it my-laravel-project-mysql-1 mysql -usail -ppassword project_db --default-character-set=utf8mb4'
- 执行
source ~/.bashrc(或对应配置文件)使别名生效
之后只需在终端输入sail-mysql,就能直接进入带utf8mb4支持的MySQL CLI。
方案3:自定义Artisan命令
自己写一个简单的Artisan命令,封装连接逻辑,方便和Sail无缝配合:
- 生成新的Artisan命令:
sail artisan make:command MysqlConnect
- 编辑生成的
app/Console/Commands/MysqlConnect.php文件:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class MysqlConnect extends Command { protected $signature = 'db:connect'; protected $description = 'Connect to MySQL with utf8mb4 support'; public function handle() { // 从配置文件读取数据库连接信息,避免硬编码 $container = config('database.connections.mysql.host'); $user = config('database.connections.mysql.username'); $password = config('database.connections.mysql.password'); $database = config('database.connections.mysql.database'); // 执行docker exec命令进入MySQL CLI exec("docker exec -it {$container} mysql -u{$user} -p{$password} {$database} --default-character-set=utf8mb4"); } }
- 执行命令测试:
sail artisan db:connect
这个方法的好处是不用记住容器名或数据库信息,直接复用Laravel的配置。
内容的提问来源于stack exchange,提问作者IGP
相关产品推荐
相关产品推荐

