MySQL不存储西里尔字符集

时间:2016-06-16 16:10:49

标签: php mysql character-encoding

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

1 个答案:

答案 0 :(得分:0)

ИринаИрина的Mojibake。

尝试使用utf8 / utf8mb4时,如果看到 Mojibake ,请检查以下内容。 此讨论也适用于双重编码,这不一定是可见的。

  • 要存储的字节需要utf8编码。
  • INSERTingSELECTing文本需要指定utf8或utf8mb4时的连接。 (new PDO('...;charset=UTF8', ...);
  • 该列需要声明为CHARACTER SET utf8(或utf8mb4)。
  • HTML应以<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就搞砸了。