我知道答案很简单,但我要疯了。我想我已经尝试了所有可用的解决方案。开始了...
我有一个带有 charset latin1的数据库。是的,我应该把它放在utf8中,但是我有几个正在运行的项目,所以我不想弄乱它们。
这个问题伴随SELECT
着LIKE "%...%"
该表是带有 COLLATE utf8_general_ci 的 utf8。这些字段也是带有 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 行;并且通过第二个查询,我只得到第二行。不区分大小写的搜索似乎运作良好,但不区分重音则不行。
所以我尝试COLLATE utf8_general_ci
在 LIKE 之后添加"%...%"
。结果相同。
然后,我发现连接是在 latin1 中建立的(通过 PHP 函数mysql_client_encoding()
)。所以我每次建立连接时都添加一个查询,指示使用utf8。我同时使用了SET NAMES UTF8 COLLATE utf8_general_ci
AND php 的mysql_set_charset()
. 当我添加此配置时,第一个查询返回第 1 行,但第二个查询不返回任何结果。此外,所有结果都返回稀有字符(你知道,像 ð,即使全部设置为 utf8)。
这让我很困惑。一切都以 UTF8 设置,但它不像(我)期望的那样工作。
MySQL Server 5.0.95
PHP 5.2.14
Win7