1

我正在为一个法国客户开发一个应用程序,该客户拥有其数据库 MySQL、排序规则 Latin1、字符编码 swedish_general_ci。我假设在 ISO 编码术语中对应于 ISO 8859-15 标准(这是单字节编码并包含“讨厌的”字符)。

在表 'mytable' 中有一列 'mycolumn' 具有以下记录/行:“Il est au cœur du débat” 我正在从 PHP 5.3 进行查询,基于是否在此表的 comumn 中的关键字。查询是带有 LIKE 子句的简单 SELECT 并且一切都返回正确的结果,除非我从 PHP 执行此操作:

$tag = $_GET['search']; // the value of tag is ckecked as "cœ" (I printed in a file)
$res=query("SELECT * FROM `mytable` WHERE `mycolumn` LIKE '%" . $tag . "';");

它应该返回上面的“Il est au cœur du débat”结果,但是,它没有(count($res) 为零)。如果我只是从代码中复制上述查询(我将 $tag 替换为“cœ”)并将其直接粘贴到 phpMyadmin 并执行 SQL,它可以正常工作,并显示该行作为结果。我提到重音字符不是问题。我错过了什么?谢谢

4

2 回答 2

1

Latin-1 (ISO-8859-1) 不包含 OE 连字。Latin-9 (ISO-8859-15) 可以。UTF-8 OE 将是一个 2 或 3 字节的单字符。请注意,只有一小部分 UTF-8 可以转换为单字节编码。您需要准确找出数据库中存储的内容——其中的文本实际上是 UTF-8(多字节)、Latin-1、Latin-9 还是其他?祈祷它不是多种编码的混合!查看 phpMyAdmin 之类的实用程序为该字符显示什么内容,以及使用何种编码。请注意,该字段的编码不一定对应于该特定 oe 字符出现的字节。如果该字段是单字节编码,它应该接受任何输入而不破坏它(但不一定会显示预期的字符)。

一旦您了解了数据实际上是如何存储在数据库中的,您就可以专注于如何将您的网页输入(可能是 UTF-8)转换为与数据库中的内容匹配的正确编码。

于 2013-10-17T17:47:08.527 回答
0

您的网页是 UTF-8 吗?如果是这样,您需要先转换它,然后才能使用它。并确保至少在将数据传递到查询(或使用准备好的语句)之前对其进行转义。您对所写的 SQL 注入持开放态度。

于 2013-10-17T16:57:11.600 回答