Mysql / Phpmyadmin中的德语变音符号

时间:2009-06-27 17:31:21

标签: php mysql utf-8 character-encoding

我有使用UT8编码的Flex应用程序。它将发送回Server(PHP),并将数据写入Mysql(UT8 charset,utf8_general_ci)。我从/向数据库写/读Umlaute都没有问题。

我才意识到,通过使用PHPmyadmin查看数据,Umlaute以某种方式转换为:

ö=>一个¶ ü=>那张 等

正如我所说,我完全没有问题。奇怪的是,当我直接用PHPmyAdmin将Umlaute写入数据库时​​,它们会正确显示

现在我正在打印PDF,我需要在所有值上调用ut8_decode()来正确显示它们。但是,手动输入到DB中的那些(在phpmyadmin中正确显示)不会被解码。

我认为那些不会写入UT8中的Db,因为解码会使它们变形吗?

  1. )但是为什么首先在数据库中以这种奇怪的方式显示UT8编码的值? 2.)如何使用UTF编码的PHPmyAdmin将数据输入mysql? (我已将连接设置为ut8)。
  2. THX, 马丁

8 个答案:

答案 0 :(得分:18)

我长期以来一直在努力解决同样的问题。连接到数据库后立即运行此查询,您的Web应用程序将显示出现在phpmyadmin中的字符:

SET NAMES'utf8'

出于某种原因,MySQL在我的系统上设置为假设输入和输出被编码为latin1,这意味着当我发送它utf8输入时,它将它存储在数据库中的错误,但因为转换是反转输出,所以撤消并在浏览器中正确显示(除非使用phpmyadmin,它忠实地显示它)。仅当转换导致存储它的数据库字段中使用的字符集允许的字符时才会出现这种情况,因此除非您使用上述查询停止此转换,否则您可能会收到错误。

答案 1 :(得分:2)

您可以在每次打开与MySQL服务器的连接时执行查询SET NAMES 'utf8',或者如果您具有对sql server的管理访问权限,则可以将这些行添加到my.cnf文件中。这将把UTF-8设置为每个新连接和每个新创建的数据库和表的默认字符集:

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8

答案 2 :(得分:2)

我遇到了同样的问题。我在我的数据库中用PHP保存了数据。当我通过PHP脚本显示数据时,一切都很好。但当我在phpmyadmin中观看数据时,变音符显示错误。 问题的核心是在我的Windows机器上运行的PHP默认在latin1中与mysql服务器通信,尽管服务器本身设置为utf8。我通过PHP连接到我的mysql-server后手动设置一个字符集解决了这个问题:

$mysqliObj->set_charset("utf8");

现在数据已正确存储和显示。

答案 3 :(得分:1)

在谈论这类问题时你必须记住的基本事实是:字节和文本是两个不同的东西,每当你在它们之间进行转换时,你必须使用正确的字符编码,即同样的/将用于反向转换,并支持所有正在使用的字符。

问题在于,每增加一次转换以及所涉及的每个其他应用程序,都有可能出现问题。 Web应用程序是这方面最糟糕的情况,因为总有多次转换(通常是2 *(应用程序数量-1))和涉及的几个不同的应用程序 - 至少是:Web应用程序,浏览器和数据库。在您的情况下,PHPMyAdmin也是如此。

当有这么多时,很难说哪个转换出错了。但是,看起来您的问题是由PHPmyAdmin引起的,因为它将变音符号显示为两个字符,这对于尝试将UTF-8编码字节解释为Latin1的应用程序来说是典型的。现在的问题是,当PHPmyAdmin从数据库获取数据或将数据发送到浏览器时是否发生了错误的转换。 PHPmyAdmin在其HTML页面的标题中声明了什么编码?您是否可以选择通过DbVisualizer等非网络应用访问数据库?如果是这样,那就这样做,因为它消除了一次转换(因此可能导致错误)。

答案 4 :(得分:0)

在MySQL中设置字符集有很多不同的地方,很棒。

听起来你实际上并没有存储UTF8,而是将UTF8字符串存储为latin1。如果在您从数据库中读取时它们以某种方式转换为UTF8,它们仍将在您的应用程序中正确显示。

您是否正在设置与UTF-8的连接?

SET CHARACTER SET utf8;
SET SESSION character_set_server = utf8;
SET character_set_connection = utf8;

答案 5 :(得分:0)

这是一种可能性:

听起来像phpMyAdmin将UTF-8数据显示为Latin-1。检查phpMyAdmin正在推出的Content-Type标头。如果你有使用webdev工具栏的firefox,你可以通过转到信息 - >直接看到标题。查看响应标头或信息 - >查看页面信息

答案 6 :(得分:0)

在打开mysqli连接后立即使用mysqli_set_charset(<connection goes here>,'utf8');

顺便说一句,PHP规范更喜欢使用此函数而不是使用查询:

  

这是更改charset的首选方法。使用mysqli_query()   不建议设置它(例如SET NAMES utf8)。看看MySQL   字符集概念部分了解更多信息。 (http://php.net/manual/mysqli.set-charset.php

答案 7 :(得分:0)

整理latin1_general_ci对我有用。