mysql 插入时出现 unicode 文本不正确的字符串警告,尽管字符集变量设置为 utf8mb4

mysql unicode text incorrect string warning on insert, despite character set variables set utf8mb4

首先,我知道,是的,这是另一个 mysql unicode 问题。

问题:我无法将 unicode 文本插入我的 mysql 数据库

我想执行以下查询:

INSERT INTO usert SET username='田中'

当我这样做时,我收到此警告:

Incorrect string value: '\x93c\x92\x86' for column 'username' at row 1

空白 space 被插入 table 而不是数据

我尝试了尽可能多的答案和论坛,我相信所有适当的变量,table,和列设置都设置为 'utf8mb4' 字符集,排序规则 'utf8mb4_general_ci' 或 'utfmb4_unicode_ci'

我会通过向您提供详细信息和用于显示它们的 sql 命令来告诉您为什么我相信这一点。

第一,mysql版本:

mysql:> SHOW VARIABLES LIKE 'version'

确认版本为5.6.23

显示mysql中的字符集变量:

mysql:> SHOW VARIABLES LIKE '%char%'

该命令显示(格式略有不同):

character_set_client: utf8mb4
character_set_connection: utf8mb4
character_set_database: utf8mb4
...
character_set_results: utf8mb4
character_set_server: utf8mb4
character_set_system: utf8

整理:

mysql:> SHOW VARIABLES LIKE '%collat%'

结果:

collation_connection: utf8mb4_unicode_ci
collation_database: utf8mb4_unicode_ci
collation_server: utf8mb4_unicode_ci

到目前为止还好吗?

现在,对于 table 字符集和排序规则:

查看table详情命令:

mysql:> SHOW TABLE STATUS

显示排序规则是utf8mb4_general_ci

查看列详细信息的命令:

mysql:> SHOW FULL COLUMNS IN usert

确认列 'username' 的排序规则是 utf8mb4_general_ci

综上所述,根据我的研究,所有相关变量、数据库、table和列设置似乎都设置为相关的 utf8mb4 设置。尽管如此,我还是无法插入 unicode 日文文本。

(顺便说一句,我认为这里不需要 4 字节的 unicode 设置 utf8mb4,但我正在使用它,因为它似乎解决了许多其他 unicode mysql 问题)

mysql 或系统中的哪些其他设置可能导致此问题? 我可以/应该更改哪些其他设置以允许适当地插入日文文本?

编辑更新:我在日本电脑上

问题是默认的系统设置,这也影响了命令行的输入设置。

这是一台日本计算机,显然默认使用 shift-jis 编码,而不是 unicode。我输入的文本是以这种方式编码的,并且在我尝试使用的类似输入文件中。

因此,我在服务器中设置字符集为'jsis', 即在 my.ini 初始化文件中设置 character-set-server=sjis,并通过在同一初始化文件中输入 skip-character-set-client-handshake 将 mysql 字符集设置为相同。

列的字符集当然也必须通过

更改

ALTER TABLE usert MODIFY username varchar(30) CHARACTER SET sjis COLLATE sjis_japanese_ci

现在,您可以从命令行插入日文文本,以及使用 shift-jis 编码的其他日文文件。

另一个输入日文的选项似乎是 cp932,它是 shift-jis 的 windows 版本。

顺便说一句,如果您确实希望通过命令行使用 unicode,显然 powershell 对它有更好的支持,而不是我使用的普通 cmd,但我还没有亲自尝试过。

尝试检查数据库的字符集。

  1. 使用以下命令检查数据库的字符集:

SELECT @@character_set_database, @@collation_database;

  1. 如果结果为 1 个不同的 UTF-8,则尝试以下命令:

ALTER DATABASE yourDatabase CHARACTER SET utf8 COLLATE utf8_unicode_ci;

希望对你有用。