这个问题似乎是$mysqli->set_charset()
不接受`utf8mb4' 作为一个有效的编码(在第一更新正如我‘猜测’)。 MySQL版本是5.5.41,PHP版本是5.4.41(没有问题)。
很抱歉的标题,我一直在寻找/读什么/问题在那里可以和我已经太糊涂了这个...
我使用utf8mb4最近开始在MySQL 。我使用utf8mb4作为字符集和utf8mb4_unicode_ci作为所有表/列的归类。
所以我第一次我改变:
$mysqli->set_charset('utf8');
到
$mysqli->set_charset('utf8mb4');
确信我的PHP文件是UTF8(我使用Visual Studio代码以便文件在UTF-8中创建默认情况下),和PHP/HTML头被设置为UTF-8:
的index.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不能正常工作,当你改变一些数据库/表配置和唯一的方法是旧的方式(运行自己的查询),但我didn我还没试过,但是。我运行查询来设置所有表/列的字符集和排序规则。
您认为如何?
UPDATE
我开始认为的mysqli不接受utf8mb4为有效的字符编码,并从PHP使用UTF-8,而不是来自MySQL的...我也觉得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?为什么当utf8mb4设置为mysqli时,php显示特殊字符ï
为�
?
有人可以确认mysqli::set_charset
接受utf8mb4作为一个有效的编码吗?
UPDATE 3
我有一个类函数,其选择从表中的字符串“ES”,例如:Iniciar Sesión
(这是什么存储),并且如果mysqli的字符集是UTF8,正被选择什么/显示为Iniciar Sesión
。
这可能是一个完全不同的问题,但它显然是另一个编码问题。根据我的理解,如果表/列是utf8mb4并且mysqli设置为utf8,则mysql必须从utf8(3字节)到ut8mb4(全字节支持)进行编码。所以这意味着mysqli
不使用来自php的utf8,而是使用mysql。这是正确的,对吗?
我的应用程序,目前有一个粗略的时间与编码...(但也许是一些服务器的配置问题...)
UPDATE 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)
UPDATE 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`
没有转换?你的意思是BLOB?处理UTF8的经验法则是:总是记录转换+编码+解码方法。 – mootmoot
什么是BLOB?我认为php为我处理...如果PHP使用utf8并从MySQL中获取utf8mb4,需要什么样的转换? –
BLOB是一种MySQL数据类型,通常用于存储大量的文本或二进制数据。看到这里http://dev.mysql.com/doc/refman/5.7/en/blob.html。 – Vadim