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