2

我使用带有“Like”的非常简单的查询来按名称查找产品

SELECT p_pid, p_name, p_cat
FROM products
WHERE p_sid=346 AND p_name LIKE 'product name here in utf-8 encoding, can be various languages'
LIMIT 1

当我从具有有效产品名称的代码运行此查询时,我没有得到任何结果。如果我将查询(由 php 回显到浏览器)复制并在 mysql 查询浏览器中手动运行,我会得到结果。知道我哪里错了吗?

笔记:

1.查询没有错误。就是没有结果。2. 我正在使用 ezsql 库 3. 代码运行良好,并在代码的同一范围内成功执行了与数据库的其他 SELECT。

4

3 回答 3

3

似乎是编码的问题。

尝试运行此查询:

SELECT HEX(CAST('product name here in utf-8 encoding, can be various languages' AS BINARY))

在查询浏览器中ezSQL和在查询浏览器中比较结果。

这将为您提供MySQL真正从您的客户端获取并用于比较的二进制流。

如果您在ezSQL属性中设置了错误的连接编码,则字符串可能会被破坏(例如,问号而不是UTF符号)。

在这种情况下,比较当然会失败。

更新:

尝试强制不区分大小写的排序规则:

SELECT  *
FROM    table
WHERE   field LIKE 'product name here in utf-8 encoding, can be various languages' COLLATE UTF8_GENERAL_CI

另外,您能否同时发布您的字符串和字段中包含的数据的二进制转储?

SELECT  p_pid, p_name, p_cat,
        HEX(CAST(p_name AS BINARY)),
        HEX(CAST('product name here in utf-8 encoding, can be various languages' AS BINARY))
FROM    products
WHERE   p_pid = @pid_of_product_that_should_match_but_it_doesnt
于 2009-05-31T10:51:15.737 回答
1

手动和自动运行脚本的机器、数据库和用户是否相同?一个可能正在访问测试服务器,而另一个访问生产服务器(例如。)

于 2009-05-31T12:44:39.500 回答
0

可能是编码错误,没有通过代码发送正确的信息,所以它正在搜索某些东西,因此没有错误,但不是它要搜索的内容。手动扫描你的代码,重新做一些代码,看看你是否发现了任何可能有问题的地方。

如果它确实是一个编码错误,PHP 的片段可能会有所帮助。

希望这可以帮助。

于 2009-05-31T11:10:01.190 回答