【问题标题】:Retrieve through mysql query the 'œ' character in PHP通过mysql查询PHP中的'œ'字符检索
【发布时间】:2013-10-17 16:50:47
【问题描述】:

我正在为一个法国客户开发一个应用程序,该客户拥有其数据库 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,它可以正常工作,并显示该行作为结果。我提到重音字符不是问题。 我错过了什么?谢谢

【问题讨论】:

  • 是的,它基于mysql_query()。它适用于不包含该字符的任何其他 SELECT
  • @GingerOpariti Try $res=query("SELECT * FROM mytable WHERE mycolumn LIKE '%$tag%' ");` - 所以对于@987654325 周围的反引号不太好@哪里mycolumn
  • @Fred:这是 MySQL 推荐的语法。此外,- 字符是唯一搞砸的不是语法
  • @GingerOpariti 如果你要使用它的 DEC-OCT-HEX-BIN 等效项呢?
  • @Fred:真的不明白......这个字符在一个字符串中,它是 SELECT 语句的一部分,那么如何“使用”?事实上这是我的问题

标签: php mysql character-encoding


【解决方案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)转换为与数据库中的内容相匹配的正确编码。

【讨论】:

  • Phil,我在文章开头设置了数据库编码模式。我还向您的其他 cmets 发表了讲话。我知道数据库中的内容和编码是什么。我也很清楚如何使用 phpmyadmin。我已经在字符级别读取和处理字符串“cœur”并将其转换为“coeur”(编程中的常用方式),以便我可以将其发布在 utf-8 编码的 html 页面上。唯一的问题是上面的 SELECT,来自 PHP(不是来自它工作的 phpmyadmin ......)返回 nada
  • 如果数据库encoding是Latin-1/ISO-8859-1(瑞典语collat​​ion进行排序),你需要先搞清楚这个“oe”最终被放入数据库的单字节或多字节值是什么。它必须替换一些常规的 Latin-1 字符(或者它是多字节 UTF-8?)。大概有人已经指定了 UTF-8 或其他输入编码更改为什么。然后,您可以弄清楚在查询中将“oe”更改为什么,以便从 SQL 中获得匹配项。然后最后一步是将返回的查询转换回 UTF-8 或您的页面呈现的任何内容。
【解决方案2】:

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

【讨论】:

  • 是的,我的页面是 UTF-8 格式的。你能更具体一点吗?我已经尝试了所有三种类型的 PHP 转换函数。我遇到的问题只是且仅针对 – 字符,仅在 ISO 8859-15 中的单字节表示中发现。所有其他法语重音字符均已正确处理
  • 你尝试过哪些功能?你试过我在帖子中分享的链接吗?回答转换问题
  • 我已经尝试过 utf8_encode、iconv 和 mb_convert_encoding,但对于像 'cœur' 这样的字符串没有结果。在最好的情况下,他们只是删除了 'œ' 字符。我的理解是,在您的链接中,它是关于逐个字符转换的。我的 $tag 来自数据输入,它是一个字符串,所以我想知道是否有一种方法可以将函数应用于该字符串而无需任何修改
  • @GingerOpariti 你总是可以在它进入数据库之前通过preg_replace 捕获它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-04
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多