我正在尝试在文本类型列中保存包含电子邮件 html 的字符串。但我收到这个错误。我没能找到不兼容的字符在哪里。我可以使用任何消毒方法将所有
utf8_unicode_ci
转换为 utf8mb4_0900_ai_ci
?
您可以在插入正确的排序规则之前转换文本
SELECT CONVERT('abc' USING utf8mb4) COLLATE utf8mb4_0900_ai_ci;
我的具体问题实际上是由 PHP substr 引起的。
echo substr('ããããã', 0, 5);
//ãã�
它使用utf8_encode,获取子字符串,然后使用utf8_decode。在此示例中,字符串“ããããã”在内部调用 utf8_encode 后变为“à£à£à£àà”,然后通过 substr 裁剪为“à£àà”,当应用 utf8_encode 时,它最终为“呀呀”。
我使用 Laravel helper substr 而不是 php 解决了这个问题。
插入十六进制字符也存在类似的问题。
只需更改数据库连接的编码即可(answer):
$conn->set_charset('utf8mb4'); // for mysqli
$dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";
// ^^^^^^^^^^^^^^^ for PDO
使用框架时,此设置在配置文件中指定。
我的编码是utf8,将其更改为utf8mb4后一切正常。