2010-05-13 62 views
2

我将我的php应用程序移至新服务器。我使用mysql5分贝。当我更新或插入某些数据库时,每个"-标志更改为?。我使用SET NAMES UTF8SET CHARACTER SET,但它不起作用。有任何想法吗?mysql和编码

回答

0

我的猜测是,你从它转化成"有角度的漂亮报价有些文本编辑器粘贴,并且将您的-成MDASH,这是造成两者被表示为?

虽然您将数据库设置为接受UTF8字符,但您可能未设置Web服务器/ PHP以接受这些字符。尝试玩mbstring函数,但请检查以确保您未使用倾斜的引号或破折号。

+0

还有其他方法去做这个?我无法安装任何额外的软件包到我的PHP发行版,似乎没有安装mbstring – qqryq 2010-05-13 01:13:01

+0

我不确定。你可以尝试运行一个HTML编码来转换引号......但这可能不是最好的解决方法。 – 2010-05-13 01:14:59

2

SET NAMES UTF8应该在每个页面上使用,当选择以及更新或插入时。

实际上,每次连接到数据库时都必须使用此查询。只需添加它即可连接代码。

+0

它是everywere,我有我的db_connect.php文件,我包括无处不在。 – qqryq 2010-05-13 11:31:30

1

您需要UTF-8全部贯通,使智能引号和破折号的方式(“” - )其他非ASCII字符和可靠地工作:

(1)确保浏览器会将您编码成UTF字符-8。通过声明,包括形式为UTF-8的页面操作:

<head> 
    <meta http-equiv="Content-Type" content="text/html;charset=utf-8"> 
    ... 

(忽略<form accept-encoding>,这并不在IE右键工作)

(2)与原始字节PHP交易和不关心他们在编码什么,但数据库确实在意,所以你必须告诉它什么编码来自PHP的字节进来。这就是SET NAMES正在做什么,但mysql_set_charset可能更可取。

(3)一旦正确的字符到达数据库,它将需要将它们存储在Unicode编码中以确保所有字符都适合。每列可以有不同的编码,但当您使用UTF-8编码时,您可以使用DEFAULT CHARACTER SET utf8来使CREATE table中的所有文本列都可用。如果您愿意,也可以将数据库或整个服务器的默认字符集设置为utf8

如果您已经有CREATE d表并且它们是非UTF-8归类,则必须重新创建表或alter表。您可以使用SHOW FULL COLUMNS FROM sometable;来检查当前的排序规则。 (4)请确保您使用htmlspecialchars()而不是htmlentities()来自PHP输出的HTML编码文本,默认情况下会混淆非ASCII字符。 [作为(2)和(3)的替代方法,只需使用连接和表存储的默认Latin-1编码,但仍然可以将UTF-8字节放入其中。这种方法的缺点是,看着数据库的其他工具看起来不对,而小写/大写字符不会以预期的不区分大小写的方式相互比较。]

+0

我已经把这个UTF8字符集标题放到了我的页面顶部,但它没有帮助,当我提交像“”这样的字符形式 - 并在phpMyAdmin中检查它们时,它们变成了'?'。我不知道为什么。 – qqryq 2010-05-14 17:00:13

+0

我怀疑你的表没有存储UTF-8。请检查点(3)。 – bobince 2010-05-14 17:22:45