【问题标题】:Using prepared statement to search Unicode data in SQLSERVER使用准备好的语句在 SQL SERVER 中搜索 Unicode 数据
【发布时间】: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


【解决方案1】:

您没有正确使用 SQL 通配符;

SELECT * FROM users WHERE firstName LIKE '%' + :firstName + '%'

% 符号是 SQL 的通配符运算符,上面应该适合你。

【讨论】:

  • 我明白了。但这不起作用,我收到一个错误“数据类型 varchar 和 varbinary 在 add 运算符中不兼容。”我在想 '%' 是 varchar 并且参数被视为 varbinary
  • 您可以从参数中删除“%”。这些也是它使用的一些非常不寻常的字符,你能看看它是否适用于更常见的字符吗?
  • 嗯,它适用于 latin1 字符集中的字符,就像原始帖子一样。它不适用于泰语/西里尔字符
猜你喜欢
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多