gpt4 book ai didi

php - mysqli 没有将字符集设置为 utf8mb4

转载 作者:行者123 更新时间:2023-12-04 16:07:03 25 4
gpt4 key购买 nike

发现问题

问题似乎是$mysqli->set_charset()不接受 `utf8mb4' 作为有效编码(正如我在第一次更新中“推测”的那样)。 MySQL 版本是 5.5.41,PHP 版本是 5.4.41(没问题)。

抱歉标题,我一直在搜索/阅读问题是什么/在哪里,我已经对此感到困惑......

我最近开始在 mysql 中使用 utf8mb4。我使用 utf8mb4 作为字符集,使用 utf8mb4_unicode_ci 作为所有表/列的排序规则。

所以我首先改变了:

$mysqli->set_charset('utf8');


$mysqli->set_charset('utf8mb4');

确保我的 php 文件是 utf8(我使用的是 Visual Studio Code,因此默认情况下这些文件是以 UTF-8 创建的),并且 php/html header 设置为 utf8:

索引.php
header('Content-type: Text/HTML; Charset=UTF-8');

main.php(包含在 index.php 的末尾)
<meta http-equiv="Content-Type" content="Text/HTML" />
<meta charset="UTF-8" />

问题是对于某些表,我必须手动插入数据,并且这些数据按原样存储:带有特殊字符、重音符号、ñ 等......当我在我的网站上显示这些数据时,我可以看到这些字符 已替换特殊/重音字符。

所以我的问题是:有什么方法可以在 mysql 中按原样存储数据(不替换/转换特殊/重音字符)并能够正常显示(按原样)?

如果我恢复到 $mysqli->set_charset('utf8');数据显示良好......所以这让我想知道存储utf-8字符应该没有问题,并且某处存在一些编码问题......

我正在使用 sqlyog 社区(带酒),我在某处读到,当您更改某些数据库/表配置时,gui 有时无法正常工作,唯一的方法是旧方法(自己运行查询),但我没有试过这个了。我运行查询来设置所有表/列的字符集和排序规则。

你怎么认为?

更新

我开始认为 mysqli 不接受 utf8mb4 作为有效的字符编码,而是使用来自 php 而不是来自 mysql 的 utf8 ......我还认为 mysql fckd 创建 utf8mb4 而不是更新现有的 utf8 以支持 4 个字节...... .

当我使用 mysqli 字符集 utf8 进行测试时,所有内容都按原样存储并按原样显示(mysql 字符集和排序规则设置为 utf8mb4...)。

更新 2
SELECT name, HEX(name) FROM person LIMIT 1

这是它的输出:
New Person has name Altaïr 416C7461C3AF72

但正如我已经说过的,这是使用:
$mysqli->set_charset('utf8');

插入和选择。如果我使用 utf8mb4 代替,这就是它存储的内容:
Altaïr

但是显示正常。不显示正常的是如果名称按原样存储,显示的名称将为 Alta�r .

那么问题来了:为什么mysqli/mysql存储 ïï使用utf8mb4?为什么 php 显示特殊字符,如 ï什么时候在mysqli中设置utf8mb4?

有人可以确认 mysqli::set_charset接受 utf8mb4 作为有效编码?

更新 3

我有一个从表“es”中选择字符串的类函数,例如: Iniciar Sesión (这是存储的内容)如果 mysqli 字符集是 utf8,则选择/显示的是 Iniciar Sesión .

这可能是一个完全不同的问题,但显然是另一个编码问题。根据我的理解,如果表/列是 utf8mb4 并且 mysqli 设置为 utf8,则 mysql 必须从 utf8(3 字节)编码到 ut8mb4(全字节支持)。所以这意味着 mysqli不使用来自 php 的 utf8,而是来自 mysql。这是正确的,对吗?

我的应用程序目前在编码方面遇到了困难......(但可能是一些服务器配置问题......)

更新 4

问题可能出在这里吗?我真的不知道这种配置:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| collation_connection | utf8_general_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | latin1_swedish_ci |
+--------------------------+--------------------+
10 rows in set (0.00 sec)

更新 4-1/2 (复制自评论)
CREATE TABLE `es` (
id int(11) NOT NULL AUTO_INCREMENT,
name varchar(30) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
text varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY name (name)
) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci`

最佳答案

问题可能源于您没有使用 utf8mb4在您的 MySQL 列定义中(至少您没有说明您使用的是什么编码)。

这是 MySQL 表定义的示例,其中一列使用 utfmb4 :

CREATE TABLE `person` (
`name` varchar(255) CHARACTER SET utf8mb4
)

更新

使用下表定义:
CREATE TABLE `person` (
`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

以及以下 PHP 脚本:
<?php
$mysqli = new mysqli('localhost', 'username', 'password', 'database');
$mysqli->set_charset('utf8mb4');

$mysqli->query("INSERT INTO `person` VALUES ('Altaïr Ibn-La\'Ahad')");

$result = $mysqli->query("SELECT * FROM `person` LIMIT 1");

$person = $result->fetch_object();

if($person)
printf ("New Person has name %s.\n", $person->name);

$result->close();
$mysqli->close();

当我将“Altaïr Ibn-La'Ahad”插入数据库时​​,名称按原样存储,没有更改。该脚本还没有更改地打印名称:“ 新人的名字是 Altaïr Ibn-La'Ahad。

我希望这可以帮助您解决您的问题。让我知道它是否存在。

关于php - mysqli 没有将字符集设置为 utf8mb4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36894731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com