【发布时间】:2016-04-27 21:33:37
【问题描述】:
我有一个表,其中有一列 firstName,类型为 NVARCHAR。我正在编写一个查询以按部分名字进行搜索。我的查询如下所示:
$params[':firstName'] = "%วุฒิหิรัญทิ%";
$query = "SELECT * FROM users WHERE firstName LIKE :firstName";
$matches = $this-db->fetchAll($query, $params);
这不起作用,我在 MSSQL 中读到我需要使用 N 来搜索 Unicode 字符。我如何在准备好的声明中做到这一点?我尝试将:firstName 替换为N:firstName,但没有成功。
编辑:此解决方案适用于拉丁 1 字符集中的字符。它不适用于该集合之外的字符。对于特殊字符,我可以直接运行查询,例如SELECT * FROM users WHERE firstName LIKE N'%วุฒิหิรัญท%',它工作正常,但我无法让它与准备好的语句一起工作。
【问题讨论】:
-
我不熟悉如何在查询中解析变量 :firstname,但你不应该用“'”包围它吗?像这样:
... LIKE ':firstname' -
不,准备好的语句通常避免使用引号
-
好的,您确定您正在使用通配符搜索来搜索准备好的语句吗?看看stackoverflow.com/questions/1352002/…
-
我使用它们的方式是为 latin1 字符集中的字符工作。但它不适用于 UTF-8 字符(在本例中为泰语)
-
最终,原始查询工作正常。似乎存在编码问题,并且所有 unicode 字符串都被解析为 varbinary。我写了一个解决方法,因为我还没有找到编码问题的根源。由于我们将在年底前迁移数据库引擎,因此我将不再追究实际来源
标签: php sql-server pdo dblink