我正在为一个法国客户的应用程序工作,该客户的数据库是MySQL,collation Latin1,字符编码为swedish_general_ci。我假设ISO编码术语符合ISO 8859-15标准(单字节编码并包含'讨厌' - 字符)。
在表'mytable'中有一个'mycolumn'列,其中包含以下记录/行: “Il estaucœurdudébat” 我正在从PHP 5.3进行查询,基于此表的列中是否存在关键字。查询是简单的SELECT with LIKE子句,一切都返回正确的结果,除非我从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 estaucœurdudébat”结果,但是,它没有(count($ res)为零)。 如果我只是从代码中复制上面的查询(我用“cœ”替换$ tag)并将其直接粘贴到phpMyadmin并执行SQL它正常工作,结果显示行。我提到重音字符不是问题。 我错过了什么? THX
答案 0 :(得分:1)
Latin-1(ISO-8859-1)不包含OE连字。拉丁语-9(ISO-8859-15)。 UTF-8 OE将是一个2或3字节的单字符。请注意,只有一小部分UTF-8可以转换为单字节编码。你需要确切地找出数据库中存储的内容 - 那里的文本实际上是UTF-8(多字节),Latin-1,Latin-9还是别的?祈祷它不是多种编码的混合物!查看像phpMyAdmin这样的实用程序为角色显示的内容,以及什么编码。注意该字段的编码不一定对应于特定oe的字节字符出现在。如果字段是单字节编码,它应该接受任何输入而不破坏它(但不一定显示预期的字符)。
了解数据实际存储在数据库中的方式后,您可以专注于如何将网页输入(可能是UTF-8)转换为与数据库中的数据匹配的正确编码。
答案 1 :(得分:0)
您的网页是否为UTF-8?如果是这样,您需要先convert才能使用它。并确保在将数据传递到查询之前至少转义数据(或使用预准备语句)。你可以像写的一样对SQL注入开放。