MySQL utf8mb4,保存表情时出错

MySQL utf8mb4,保存表情时出错,mysql,emoji,utf8mb4,Mysql,Emoji,Utf8mb4,我试图保存MySQL数据库中某个服务中用户的姓名。这些名称可以包含表情符号,如字符集\u客户端,\u连接,以及\u结果必须全部为utf8mb4,才能食用该短码 某些东西,在某个地方,正在单独设置这些元素的子集。翻阅my.cnf和phpmyadmin的设置——有些东西并没有全部设置好 如果执行设置名称utf8mb4,则所有三个设置都正确 阳光灿烂,因为它只有3个字节-e29880;utf8对于Unicode字符的3字节utf8编码已经足够。对于客户端字符集,您的服务/应用程序很可能是使用“utf8

我试图保存MySQL数据库中某个服务中用户的姓名。这些名称可以包含表情符号,如
字符集\u客户端
\u连接
,以及
\u结果
必须全部为
utf8mb4
,才能食用该短码

某些东西,在某个地方,正在单独设置这些元素的子集。翻阅my.cnf和phpmyadmin的设置——有些东西并没有全部设置好

如果执行
设置名称utf8mb4
,则所有三个设置都正确


阳光灿烂,因为它只有3个字节-
e29880
;utf8对于Unicode字符的3字节utf8编码已经足够。

对于客户端字符集,您的服务/应用程序很可能是使用“utf8”而不是“utf8mb4”连接的。这取决于客户端应用程序

有关PHP应用程序,请参阅或

有关Python应用程序,请参见或

另外,检查您的列是否真的是utf8mb4。一个直接的方法是这样的:

mysql> SELECT character_set_name FROM information_schema.`COLUMNS`  WHERE table_name = "user"   AND column_name = "displayname";
+--------------------+
| character_set_name |
+--------------------+
| utf8mb4            |
+--------------------+
1 row in set (0.00 sec)

对我来说,问题在于mysql客户端

mysql客户端在服务器上更新my.cnf的字符设置,并导致意外的字符设置

所以,我需要做的只是添加
字符集client handshake=FALSE
。 它禁止客户端设置干扰我的字符设置

my.cnf
就是这样

[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
...

希望有帮助。

我对这个答案并不感到自豪,因为它使用蛮力来清理输入。这是残酷的,但它是有效的

function cleanWord($string, $debug = false) {
    $new_string = "";

    for ($i=0;$i<strlen($string);$i++) {
        $letter = substr($string, $i, 1);
        if ($debug) {
            echo "Letter: " . $letter . "<BR>";
            echo "Code: " . ord($letter) . "<BR><BR>";
        }
        $blnSkip = false;
        if (ord($letter)=="146") {
            $letter = "&acute;";
            $blnSkip = true;
        }
        if (ord($letter)=="233") {
            $letter = "&eacute;";
            $blnSkip = true;
        }
        if (ord($letter)=="147" || ord($letter)=="148") {
            $letter = "&quot;";
            $blnSkip = true;
        }
        if (ord($letter)=="151") {
            $letter = "&#8211;";
            $blnSkip = true;
        }
        if ($blnSkip) {
            $new_string .= $letter;
            break;
        }

        if (ord($letter) > 127) {
            $letter = "&#0" . ord($letter) . ";";
        }

        $new_string .= $letter;
    }
    if ($new_string!="") {
        $string = $new_string;
    }
    //optional
    $string = str_replace("\r\n", "<BR>", $string);

    return $string;
}

//clean up the input
$message = cleanWord($message);

//now you can insert it as part of SQL statement
$sql = "INSERT INTO tbl_message (`message`)
VALUES ('" . addslashes($message) . "')";
函数cleanWord($string,$debug=false){ $new_string=“”; 对于($i=0;$i) 更改表格
表格名称
更改
列名称
列名称
VARCHAR(255)字符集utf8mb4 COLLATE utf8mb4\u unicode\u ci NULL 默认为空

查询示例:

ALTER TABLE `reactions` CHANGE `emoji` `emoji` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL;

之后,成功将表情符号存储在表中:

考虑添加

init_connect = 'SET NAMES utf8mb4'
到所有数据库服务器的my.cnf-s

(尽管如此,客户可以(也会)否决它)

Symfony 5回答 虽然这并不是我们要问的问题,但人们可以在Symfony的网页上搜索相同的问题后登陆这里

1.正确配置MySQL ☝️ 请参阅(如果有帮助,请向上投票)此处的主要答案

2.更改您的条令配置 /config/packages/doctrine.yaml

原则:
dbal:
...
字符集:utf8mb4

这是phpmyadmin问题,请尝试其他mysql客户端。我不认为这是phpmyadmin问题。正如您在Edit1中看到的,我认为conf/default变量/参数与数据库上的变量/参数之间存在一些错误配置。即使在创建新数据库时也是如此。
$cfg[“DefaultCharset”]
在您的PMA配置中?我没有找到
$cfg[“DefaultCharset”]
。我在
etc/phpmyadmin/config.inc.php中查找了它。
。不在那里。@jsxqf在那里,过了一会儿,重做了整个“教程”我意识到这实际上是一个mysql问题。会话变量与全局变量不同。使用我的api时发生的一个新连接使用全局变量并工作:).所以,事实上,如果你提供一个完整的答案,我会接受它,你会得到赏金。此外,如果你能说明我如何重置phpmyadmins会话变量,我将不胜感激。我没有让它工作。它们仍然设置错误。好吧,我想这让我更接近了。谢谢。我编辑了我的问题,并添加了my.cnf。也许你你可以在那里看到一些东西吗?连接需要有
utf8mb4
。如果你找不到在哪里做这件事,那么执行
SET NAMES utf8mb4
。这是一个很好的解释,说明了什么也出了问题。但除此之外,我还必须检查会话和全局变量。认识到PHPMyadmins会话变量仍然错误,error只出现在管理板上。谢谢。
mysql_query(“SET NAMES'utf8mb4');
没错;)哦,我漏掉了一个——一个短码足够容纳4个字节。