我使用以下代码在docker中创建了一个数据库:

docker run -d -p 9906:3306 --name db -e MYSQL_ROOT_PASSWORD=1234567890 -e MYSQL_DATABASE=mydb -e MYSQL_USER=myuser -e MYSQL_PASSWORD=123 mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_persian_ci;

当我try 使用PhpMyAdmin进行备份和恢复时,一切正常.但是,当我try 在PowerShell中使用docker命令时,过程已经完成,但Unicode字符受到干扰,如下所示:

‘+«+交集+纯纯纯净+零下+√所有戒指+äuts=º+√+ú+ú’

不是:

'خبر تحلیلی اول'

以下是我的备份和还原命令:

# Backup:
docker exec db /usr/bin/mysqldump -u myuser --password=123 --no-tablespaces mydb | set-content backup__.sql;

# Restore:
get-content backup.sql | docker exec -i db mysql -u myuser --password=123 mydb;

EDIT

事实上,我希望向产品经理提供一个.ps1文件,以便在不登录到phpMyAdmin的情况下备份和恢复数据库.如果PS是问题所在,除了PS之外,您还有其他建议吗?

推荐答案

  • 要使当前的PowerShell控制台完全支持UTF-8--这仅在PowerShell与with external programs通信(例如docker)时才重要--您需要将[Console]::InputEncoding[Console]::OutputEncoding以及PowerShell的$OutputEncoding首选项变量设置为UTF-8(在PowerShell (Core) 7+中,仅后者已缺省为UTF-8).

  • 要使Set-Content在保存文件时使用UTF-8,请传递-Encoding utf8.

    • 需要注意的是,在Windows PowerShell中,您总是会得到一个UTF-8文件with a BOM.

      • 如果需要(不在这里),有一个解决办法来创建无BOM的UTF-8文件,例如VIA New-Item-参见this answer.
    • However, this doesn't matter in your case, because you're using Get-Content to read the file, which handles a BOM correctly (and, in fact, needs in order for the decoding to be recognized in Windows PowerShell).
      In PowerShell 7+, BOM-less UTF-8 is the consistent default for PowerShell commands, so you don't need -Encoding utf8 (which effectively requests what the default behavior is anyway; to get a BOM there, you'd need -Encoding utf8bom) and Get-Content now assumes UTF-8 in the absence of a BOM (whereas in Windows PowerShell it assumes the active legacy ANSI code page).

因此:

# Switch PowerShell and the console to UTF-8.
$OutputEncoding = [Console]::InputEncoding = [Console]::OutputEncoding = 
  [System.Text.UTF8Encoding]::new()

# Backup:
# Note the uses of -Encoding uf8
docker exec db /usr/bin/mysqldump -u myuser --password=123 --no-tablespaces mydb |
  set-content -Encoding utf8 backup__.sql

# Restore:
get-content backup.sql | 
  docker exec -i db mysql -u myuser --password=123 mydb;

注:

  • 上面假设docker exec db /usr/bin/mysqldump ...发出UTF-8编码的文本,并且同样通过管道(Stdin)期待它;如果与实际编码不同,则用实际编码替换[System.Text.UTF8Encoding]::new().

  • [Console]::InputEncoding[Console]::OutputEncoding有效地设置了当前控制台的输入和输出code pages,然后在chcp的输出中反映出来(注意,但是你不能从PowerShell内部chcpset活动代码页,因为.NET缓存了原始代码页):

    • 严格地说,[Console]::InputEncoding不是从PowerShell会话内部发挥作用的,但[Console]::OutputEncoding是PowerShell用来解码外部程序的stdout输出from的东西.

    • 相反,$OutputEncoding是PowerShell在向外部程序发送数据to(后者通过其stdin流读取数据)时使用的编码.

  • This answer讨论如何将PowerShell控制台default转换为UTF-8,包括将系统配置为使用UTF-8 system-wide的Windows 10+方法,在这种情况下,OEM和ANSI代码页都设置为65001(UTF-8).然而,后者有far-reaching consequences个,因为它可以改变现有控制台应用程序和PowerShell脚本的行为.

Mysql相关问答推荐

SQL: Select 并计算下一行的值

MySQL生成的整型计算可以为空吗?

版本升级到5.0.0后在QueryDSL中使用Enum时出错

SQL 请求:REPLACE 和通配符 %.如何做正确的事?

MySQL - 密码哈希没有预期的格式

在 MySQL 中,如何对 LIKE 查询进行批量更新,删除字符?

Mysql时间序列数据的最小值和最大值

如何在 Shopware 6 DAL 中实施 Haversine 公式?

获取 MySQL 中每一行之间负差的总和

MySQL 8.0.30 正则表达式词匹配特殊字符

在 SQL 中的 case 语句之后将新列转换为 INT

如何在 MYSQL 中使用多个表进行插值

在 MySQL 中,我应该 Select 哪种排序规则?

mysql中float(2,2)和float()的区别

ASP.NET EntityFramework 获取数据库名称

MySQL使用phpmyadmin重新排列列的顺序

如何使用 XML_LOAD() 将 XML 文件导入 MySQL 数据库表;功能

启用 NO_BACKSLASH_ESCAPES 选项时如何转义文字百分号?

来自 MySQL 中多个表的 COUNT(*)

MySQL讲解查询理解