【发布时间】:2012-09-11 02:52:05
【问题描述】:
我知道答案很简单,但我要疯了。我想我已经尝试了所有可用的解决方案。来了……
我有一个字符集 latin1 的数据库。是的,我应该把它放在 utf8 中,但是我有几个正在运行的项目,所以我不想弄乱它们。
问题来自SELECT 和LIKE "%...%"
该表是 utf8 并带有 COLLATE utf8_general_ci。这些字段也是带有 utf8_general_ci 排序规则的 utf8。我的脚本文件 (php) 是 utf-8 编码的,服务器还提供 utf-8 格式的文件。所以,一切都是utf-8。
好的,因为所有内容都使用 utf8_general_ci 进行了整理,所以我应该能够搜索不区分大小写和不区分重音的搜索。例如:
表中有providers...
id providerName
1 Jose
2 José
我应该可以做到的……
SELECT * FROM providers WHERE providerName LIKE "%jose%"
或
SELECT * FROM providers WHERE providerName LIKE "%josé%"
并且在这两种情况下都返回了两行。但是,对于第一个查询,我只得到第 1 行;并且通过第二个查询,我只得到第二行。不区分大小写的搜索似乎运作良好,但不区分重音则不行。
所以我尝试在 LIKE "%...%" 之后添加 COLLATE utf8_general_ci。结果相同。
然后,我发现连接是在 latin1 中建立的(通过 PHP 函数 mysql_client_encoding())。所以我每次建立连接时都添加一个查询,指示使用utf8。我同时使用了SET NAMES UTF8 COLLATE utf8_general_ci 和php 的mysql_set_charset()。当我添加此配置时,第一个查询返回第 1 行,但第二个查询不返回任何结果。此外,所有结果都返回稀有字符(你知道,像 ð,即使全部设置为 utf8)。
这让我很困惑。一切都以 UTF8 设置,但它不像(我)期望的那样工作。
MySQL Server 5.0.95
PHP 5.2.14
Win7
【问题讨论】:
-
最后一部分在我听来就像您实际上在数据库中存储了错误编码的垃圾。见Handling Unicode Front To Back In A Web App。
标签: php mysql utf-8 character-encoding