不能在mysql上插入utf8字符(使用utf8 collat​​ion,charset和nameset)

时间:2010-11-30 02:59:30

标签: php mysql utf-8 character-encoding collate

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

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

<?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

3 个答案:

答案 0 :(得分:4)

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

对于后一个例子,mysql_set_charset('utf8',$link);是神奇的答案。

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

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

答案 1 :(得分:1)

“Araña”是UTF-8。字符“Ô表示西班牙语以UTF-8编码的两个字节。无论你正在阅读什么,都不会处理UTF-8并将其显示为(看起来)ISO-8859-1。

答案 2 :(得分: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重新加载以应用)。无论哪种方式,请确保客户端不会破坏它所提取的结果。

[客户] default-character-set = 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。