【问题标题】:MySQL does not process some utf8 charsMySQL 不处理一些 utf8 字符
【发布时间】:2014-06-02 01:00:09
【问题描述】:

表:

CREATE TABLE `test` (
  `f` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

连接后我发送以下 SQL:

SET NAMES utf8;

然后是 SQL:

INSERT INTO `test` (`f`) VALUES ("с????с-е в терновнике");

结果在表中我有 1 条记录,其值为“с”,最高 ????标志。 是否有机会正确处理所有此类符号? 如果这很重要,所有这些都由 PHP 完成。

【问题讨论】:

  • select length(f) from test 说什么?如果是1,那么您的文本确实被截断了。如果它更大,那么你的字符串真的在那里,你在检索它时做错了。
  • select f, length(f) from test 给出 length(f) = 2. 2 似乎等于 1 char 1 utf8 是多字节

标签: php mysql utf-8 char


【解决方案1】:

那个字符是Unicode Character 'SMILING FACE WITH SMILING EYES' (U+1F60A)

U+1F60A 位于平面 1,即补充多语言平面,但 MySQL 的 utf8 仅支持平面 0,即基本多语言平面。所以你必须使用 utf8mb4。

该符号在字体中也没有得到广泛支持,因此您可能很难显示它。


您的评论,这里是过滤掉基本平面之外的字符的演示。

<?php

$str = "с?с-е в терновнике";
$str = preg_replace('/[^\x{0000}-\x{ffff}]/u', '', $str);
echo $str . "\n";

但如果我上面的回答不清楚,MySQL确实支持 utf8mb4 中的补充平面。

【讨论】:

  • 有没有一种很好的方法可以使用 PHP 删除 mysql 不支持的所有字符。或者你可以给我一个这样的字符列表?
  • this question 可能是相关的。
  • @Vatev,谢谢,这个问题的两个答案都很有趣。
猜你喜欢
  • 2013-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
相关资源
最近更新 更多