4

我在这里面临一个非常紧张的问题..我的所有内容都是 UTF-8 ,我所有的数据库和表都是 utf8_general_ci 但是当尝试从单个 PHP 脚本插入或更新时,我看到的只是符号..但是如果我在 phpmyadmin 中编辑单词显示正确..我发现如果我在 php 中对我的字符串运行 utf8_decode() 函数,我可以让它工作,但我不打算这样做,因为它一团糟,它应该不这样做就可以工作:S

这是我用来测试的基本代码:

<?php
$conn=mysql_connect("localhost","root","root") 
  or die("Error");
mysql_select_db("mydb",$conn) or
  die("Error");
mysql_query("UPDATE `mydb`.`Clients` SET `name` = '".utf8_decode("Araña")."' WHERE `Clients`.`id` =25;", 
   $conn) or die(mysql_error());
mysql_close($conn);
echo "Success.";
?>

如果我不使用 php utf8_decode 函数解码 utf8,这就是我得到的:

而不是 Araña,我得到:Araña

4

3 回答 3

4

我多次遇到同样的问题。有时是因为我从中选择的数据库链接的类型与我用于插入的类型不同,有时是从文件数据到数据库。

对于后一种情况,mysql_set_charset('utf8',$link);是神奇的答案。

在通过 mysql_select_db 选择数据库后立即调用 mysql_set_charset。

@ref http://php.net/manual/en/function.mysql-set-charset.php

于 2011-06-27T16:12:29.377 回答
1

您提到的 DDL 与排序规则有关,而不是字符集。正确的说法是:

ALTER TABLE Clients CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

您仍然需要确保客户端库(libmysql 或 PHP 正在使用的任何驱动程序)没有将数据转码回 ISO-8859。mysql_set_charset('utf8') 将显式设置客户端编码为 UTF-8。或者,您可以发送一个 SET NAMES UTF8;在你连接到数据库之后。要隐式执行此操作,您可以更改 my.cnf [client] 块以将 utf-8 作为客户端字符编码(并应用 /etc/init.d/mysql 重新加载)。无论哪种方式,请确保客户端不会破坏它正在提取的结果。

[客户端] 默认字符集=utf8

如果您使用的是 mbstrings,则不需要使用 utf8_decode。以下 php.ini 配置应确保 PHP 端支持 UTF-8:

mbstring.internal_encoding = utf-8
mbstring.http_output = utf-8
mbstring.func_overload = 6

最后,当您以 HTML 格式显示结果时,请确认页面的编码是明确的 UTF-8。

于 2011-06-28T01:09:01.880 回答
1

“Araña”是 UTF-8。字符“ñ”表示西班牙语 ñ 以 UTF-8 编码的两个字节。无论您用什么读回它,都不会处理 UTF-8,而是将其显示为(出现)ISO-8859-1。

于 2010-11-30T03:09:31.687 回答