错误 1366 - Incorrect string value 通常是因为数据库表的字符集和存储的字符不匹配,尤其是当你试图插入包含表情符号或特殊字符(如 🎉)时,这些字符需要使用支持它们的字符集进行存储。
确保数据库和表的字符集为 utf8mb4:
-- 查看数据库的字符集
SHOW CREATE DATABASE 数据库名;
-- 查看表的字符集
SHOW CREATE TABLE 表名;如果显示... SET utf8 ...
则需要修改字符集编码
-- 第一步(修改数据库字符集):
ALTER DATABASE `数据库名` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
-- 第二步(修改表字符集):
ALTER TABLE 表名 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;第三步(修改字段字符集,如有必要):
中某些字段明确指定了字符集(如使用了CHAR、VARCHAR 或文本类型),可能还需要手动更新这些字段的字符集,以确保完全支持utf8mb4:
ALTER TABLE 表名MODIFY 字段名 VARCHAR(255)CHARACTER SET utf8mb4COLLATE utf8mb4_unicode_ci;
strong>第四步(检查连接层字符集):
即使数据库、表和字段都设置为 utf8mb4,如果应用程序与数据库之间的连接未使用正确的字符集,仍可能出现插入失败。确保在连接时设置字符集为utf8mb4。
例如:
>PHP(PDO):
$pdo =new PDO($dsn,$user, $pass, [PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMESutf8mb4"]);MySQL命令行:
SET NAMESutf8mb4;>Java(JDBC URL):
?characterEncoding=utf8mb4strong>Node.js(mysql2):
charset: 'utf8mb4' 在连接配置中指定strong>第五步(验证修改结果):
执行查看语句,确认字符集已正确更改:
--再次查看表创建语句CREATE TABLE 表名;
你应该看到 CHARACTERSET utf8mb4 和 COLLATE utf8mb4_unicode_ci 的字样。
补充说明:MySQL 的 utf8是“伪 UTF-8”,最多只支持 3 字节字符,无法存储完整的emoji(如🎉、😊、🔥 等四字节字符)。而 utf8mb4 是真正的 UTF-8编码,支持 4 字节字符,是现代Web 应用的推荐字符集。
建议:使用 utf8mb4作为数据库默认字符集,并在建表时显式指定,避免后续迁移成本。