与this的问题几乎相同。 我有这个:
$name = "Ирина";
当我将它插入我的数据库时,我得到这个:Ð~рина。
此功能:
print_r(mb_detect_encoding($name));
给了我UTF-8
。
接下来的事情:
SHOW VARIABLES LIKE 'char%';
给我回复:
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
结果:
SHOW CREATE TABLE my_db.main;
我得到:ENGINE=InnoDB DEFAULT CHARSET=utf8
使用此声明创建了数据库:
CREATE DATABASE IF NOT EXISTS my_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
当我正确应用查询SET NAMES 'utf8';
信息存储时。最后,问题是:为什么我需要在连接开始时执行此查询?
P.S。未指定MySQL中的--skip-character-set-client-handshake
。
答案 0 :(得分:0)
Ирина
是Ирина
的Mojibake。
尝试使用utf8 / utf8mb4时,如果看到 Mojibake ,请检查以下内容。 此讨论也适用于双重编码,这不一定是可见的。
INSERTing
和SELECTing
文本需要指定utf8或utf8mb4时的连接。 (new PDO('...;charset=UTF8', ...);
)CHARACTER SET utf8
(或utf8mb4)。<meta charset=UTF-8>
开头。要检查数据是否已正确存储,SELECT col, HEX(col) FROM ...
。 Ирина
的utf8编码的十六进制是D098 D180 D0B8 D0BD D0B0
。相反,如果您获得C390 CB9C C391 E282AC C390 C2B8 C390 C2BD C390 C2B0
,那么INSERT
就搞砸了。