Windows 上 MySQL 命令行中的非英文字符

Gib*_*bbs 2 php mysql mysqli

表是用以下命令创建的:

\n\n
 CREATE TABLE IF NOT EXISTS `mathsqs` (\n       `questions` varchar(5000) NOT NULL,\n ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;\n
Run Code Online (Sandbox Code Playgroud)\n\n

我已经使用 mysqli 通过 PHP 插入了数据。
\n为了确认插入,我尝试了SELECT * FROM mathsqs LIMIT 1Windows 命令行。它显示非英语字符的问号。

\n\n

如何在 MySql 命令行中查看确切的发布数据?

\n\n

我试图处理的示例数据:

\n\n
\n

\xe0\xae\x87\xe0\xae\xb0\xe0\xaf\x81 \xe0\xae\x8e\xe0\xae\xa3\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xb3\xe0 \xae\xbf\xe0\xae\xa9\xe0\xaf\x8d \xe0\xae\xaa\xe0\xaf\x86\xe0\xae\xb0\xe0\xaf\x81\xe0\xae\x95\xe0\xaf \x8d\xe0\xae\x95\xe0\xae\xb2\xe0\xaf\x8d\xe0\xae\xaa\xe0\xae\xb2\xe0\xae\xa9\xe0\xaf\x8d 3375 \xe0\xae\ x85\xe0\xae\xb5\xe0\xaf\x8d\xe0\xae\xb5\xe0\xaf\x86\xe0\xae\xa3\xe0\xaf\x8d\xe0\xae\x95\xe0\xae\xb3\ xe0\xae\xbf\xe0\xae\xa9\xe0\xaf\x8d\xe0\xae\xae\xe0\xaf\x80.\xe0\xae\xaa\xe0\xaf\x86.\xe0\xae\xb5 15

\n
\n

Anu*_*rag 5

假设您已经将表字符集设置为 utf8 并且它的排序规则为 utf8。

\n\n

尝试在 $mysqli 命令之前添加此行:

\n\n
$mysqli->set_charset("utf8")\n
Run Code Online (Sandbox Code Playgroud)\n\n

另外,在输出的页面标题中设置 utf 8 编码。

\n\n
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新:

\n\n

从命令行运行 sql 时,请确保在启动 mysql 客户端之前已设置默认字符集属性。就像是:

\n\n

使用选项 --default-character-set=utf8 启动客户端。

\n\n
mysql --default-character-set=utf8\n
Run Code Online (Sandbox Code Playgroud)\n\n

要将其设置为每次运行 mysql 客户端时自动包含的默认选项,请在 my.cnf 文件的 [mysql] 部分中添加一个条目:

\n\n
[mysql]\ndefault-character-set=utf8\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新#2:

\n\n

@GopsAB 我运行了 DML 语句来创建您指定的表。遵循相同的过程,令人惊讶的是,我遇到了同样的问题。即使在强制执行字符编码后,我也无法弄清楚为什么会显示问号。

\n\n

因此,我进一步挖掘并确保命令提示符设置为使用“Lucidia Console”字体和活动页面代码 chcp 65001,通过将控制台的属性设置为使用“Lucidia Console”字体,然后运行:chcp 65001并遵循相同的过程。

\n\n

但现在我得到的不是 \'?\' 标记,而是 BOM 字符框......但令人惊讶的是,当我复制为列值显示的控制台文本时,我得到了正确的文本:(\xe0\xae\xaa\xe0\xaf\x8b\xe0\xae\x95\xe0\xaf\x8d\xe0\xae\x95\xe0\xaf\x81\xe0\xae\xb5\xe0\xae\xb0\xe0\xae\xa4\xe0\xaf\x8d\xe0\xae\xa4\xe0\xaf\x81这直接从控制台粘贴)。奇怪哈!

\n\n

重要的!

\n\n

结果 MySQL\xe2\x80\x99s utf8 字符集仅部分实现了正确的 UTF-8 编码。它只能存储由一到三个字节组成的UTF-8编码符号;\xe2\x80\x99t 支持占用四个字节的编码符号。

\n\n

在您的情况下,字符被完美存储,并且可以在 php 页面和 sql workbench 或 Toad for SQL 等 mysql 编辑器中正确检索它们。即使在如上所述设置正确的编码和页面类型之后,只有命令行界面由于某些奇怪的原因无法显示它们。复制/粘贴时控制台中显示的文本可以在记事本或任何其他可以键入的地方正确显示。

\n\n

运行SET NAMES \'big5\';SET NAMES \'utf8\';没有任何效果

\n\n

两者都没有SET collation_connection = utf8_unicode_ci; SET NAMES utf8;做任何新的事情,只是显示了盒子,这是复制/粘贴时的实际值,但在控制台本身上被盒子掩盖了。

\n\n

所以直到这里你都很好!您的 SQL 中没有任何问题,并且存储在数据库中的值很好并且可以正确获取。

\n\n
\n

额外的东西:

\n
\n\n

MySQL\xe2\x80\x99s utf8mb4

\n\n

幸运的是,MySQL 5.5.3(2010 年初发布)引入了一种名为 utf8mb4 的新编码,它映射到正确的 UTF-8,从而完全支持 Unicode,包括星体符号。

\n\n

从 MySQL\xe2\x80\x99s utf8 切换到 utf8mb4

\n\n

对于每个数据库:

\n\n

更改数据库数据库名称字符集 = utf8mb4 COLLATE = utf8mb4_unicode_ci;

\n\n

对于每个表:

\n\n

更改表 table_name 转换为字符集 utf8mb4 整理 utf8mb4_unicode_ci;

\n\n

对于每一列:

\n\n

ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n(Don\xe2\x80\x99t 盲目复制粘贴!具体语句取决于列类型、最大长度和其他属性。上面行只是VARCHAR列的一个示例。)

\n\n

MySQL\xe2\x80\x99s utf8mb4 参考: 如何在 MySQL 数据库中支持完整的 Unicode

\n