PHP MySQL使用Latin1(iso-8859-1)尽管设置了UTF-8

use*_*510 6 php mysql utf-8 latin1

我再一次有一个奇怪而棘手的问题.

我一直在努力将MySQL数据库(以及我服务器上的其他所有内容)转换为UTF-8,以避免在获取文本并将文本放入不同数据库时转换文本.

我认为我已经部分成功,因为SHOW VARIABLES LIKE 'character_set%'回报:

character_set_client utf8 
character_set_connection utf8 
character_set_database utf8 
character_set_filesystem binary 
character_set_results utf8 
character_set_server utf8 
character_set_system utf8
Run Code Online (Sandbox Code Playgroud)

但仍然mysql_client_encoding($con);返回latin1并在输出中每个特殊字符都被替换为 .我的结论是客户端或PHP和MySQL数据库之间的连接正在使用latin1,即使我已经在文档头和my.ini中使用以下代码指定utf-8:

character-set-server = utf8
character-set-client = utf8
default-character-set = utf8
Run Code Online (Sandbox Code Playgroud)

编辑:我在[client],[mysqld]和[mysql]下添加了上面的设置

当我使用mysql_query('SET NAMES utf8;');mysql_set_charset("utf8");文本显示正确,但对我来说,这不是一个解决方案,只是一个临时修复.

有谁知道如何强制PHP(或其他任何恢复到latin1)使用utf-8?

我应该提一下,我正在使用Windows 2003 Server和Apache 2.

Bur*_*lid 2

我一直致力于将我的 MySQL 数据库(以及我服务器上的其他所有内容)转换为 UTF-8,以避免在获取文本并将文本放入不同数据库时必须转换文本。

您仍然需要确保目标数据库(或系统)设置为默认使用 UTF-8 - 并且您用于连接的库正在使用正确的字符集。仅仅因为数据采用 UTF-8 格式并不能保证其普遍兼容。

当我使用 mysql_query('SET NAMES utf8;'); 时 或 mysql_set_charset("utf8"); 文本显示正确,但对我来说这不是解决方案,只是临时修复。

这是正确的解决方案。由于连接的编码决定了客户端(在本例中为 PHP)接收数据的方式。

将其设置为默认值;您需要适当配置MySQL,然后重新启动服务器:

[client]
default-character-set=UTF8
Run Code Online (Sandbox Code Playgroud)

请注意,这会影响所有客户端,甚至命令行mysql客户端。