【问题标题】:Wrong encoding being saved in MySql database..Windows 7, Wamp server错误的编码保存在 MySql 数据库中..Windows 7,Wamp 服务器
【发布时间】:2013-04-05 02:45:46
【问题描述】:

我在 Windows 7 上使用 Wamp server 2.1 和 PHP 5.3.4、Apache 2.2.17、MySql 5.1.53。

httpd.conf: AddDefaultCharset "iso-8859-1"

php.ini: default_charset = "iso-8859-1"

我正在使用 php mysqli 类在具有 latin1 编码的表和具有 latin1 编码的列中插入数据,latin1_swedish_ci 排序规则。在 php 文件中,我通过元标记将 charset 设置为 ISO-8859-1,我渲染了一个带有 accept-charset="ISO-8859-1" 属性的表单。我使用 mysqli::set_charset 将数据库连接的字符集设置为 latin1,但输入的数据仍然损坏。据我了解,数据是有效的 latin1 字符。

代码:

$dbMain->set_charset('latin1');
$query = "INSERT INTO `table` (" . implode(',', array_keys($data)) . ") VALUES ('" . implode("','", array_values($data)) . "')";
$dbMain->query($query);

被破坏的数据:“字符 Ä、Ö、Ü、ä、ö、ü 和 ß。Shop-Produkte für die Elektronik”

当我通过 latin1 连接读取数据时,它给了我垃圾(带问号的黑色菱形)而不是我插入的数据。当我通过 utf8 连接读取数据时,它会显示正确的字符。 在 SqlYog(MySql 客户端)中也是如此。如果我运行“SET NAMES latin1”并浏览表格,我会看到 barbage 字符。如果我运行“SET NAMES utf8”并浏览表格,我会看到正确的文本。这里有什么问题?

更新:

我在 MySql 客户端中运行了以下查询:

SET NAMES latin1;
SELECT my_column,HEX(my_column) FROM my_table;

得到了这个结果

|my_column|HEX(my_column)|
--------------------------
|    ß    |     C39F     |    (entered manually from MySql client)
|   �    |       DF     |    (entered from php via latin1 connection)

我的数据库是不是 cucu 了?

【问题讨论】:

  • 我认为数据是以 utf8 编码插入的。但为什么呢?
  • 当我将名称设置为 latin1 时,它表现为 utf8,当我将名称设置为 utf8 时,它表现为 latin1。请帮忙
  • $data 来自哪里?

标签: php utf-8 character-encoding wamp latin1


【解决方案1】:

有几件事很重要:

  • 从数据库读取/查看数据时您使用什么编码?
  • 您如何查看数据库中的数据?通过 mySQL 管理员或一些 php 脚本或 html 页面?
  • 那么在浏览器中设置了什么编码?
  • 你用什么编码保存你的 php 文件?

你有没有想过编码转换?我想帮助你,因为我花了一些时间了解 latin2 和 utf8 编码(波兰语),但我需要你提供更多信息。

【讨论】:

  • 1.拉丁语1。 2. SqlYog(MySql 客户端),以及通过 php 脚本编写的 HTML。在这两种情况下,我都将连接名称设置为 latin1。我将 php 的字符编码设置为 ISO-8859-1,并渲染一个元标记,其字符集为 ISO-8859-1。 3. 在响应标头中,我看到了 ISO-8859-1。 4. php文件是用ANSI保存的,但是我也尝试过将php和html文件的编码转换为ISO-8859-1后。但结果没有区别。
  • 告诉我创建表时设置了什么编码?
  • 表和列都是 latin1 与 latin1_sweedish_ci 排序规则
  • 你试过使用 utf_8_general_ci 吗?我将在我的服务器上尝试这个(latin1_sweedish_ci)。我会告诉你,但请尝试使用 utf8_general_ci。
  • 是的,正如我在答案中提到的那样。谢谢大家的帮助:)
【解决方案2】:

好吧!保存的值完全没有问题。在这两种情况下,问题都是由检索引起的。

在 MySql 客户端的情况下,问题是当我使用 utf8 连接作为客户端的默认连接时,客户端只显示存储的正确值。可能是客户端的 UI 仅适用于 utf8 编码。

对于 HTML 响应,PHP 文件的编码为 ISO-8859-1,但 .html 模板文件以 UTF-8 编码保存。该网站使用常规解析器来解析模板,因此当它从 UTF-8 文件中获取内容并进行解析时,ISO-8859-1 数据被破坏。将 .html 文件的编码更改为 ISO-8859-1 即可解决问题。

感谢大家帮助我。我真的很感激。希望你不要生气

【讨论】:

  • 为什么不将所有内容都更改为 UTF-8?
  • 好吧,因为数据库可能包含数百万条记录,这些记录聚集在许多数据库服务器上。更多的停机时间、更多的风险等等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-31
  • 1970-01-01
  • 2015-01-28
  • 2011-02-03
相关资源
最近更新 更多