【问题标题】:Compare MFC CString like MySQL compares比较 MFC CString 就像 MySQL 比较
【发布时间】:2016-05-09 13:45:03
【问题描述】:

MySQL 使用与CString::CompareNoCase 不同的比较运算符进行排序,这导致了一些难以检测的错误。主要问题似乎是令牌_

如何将一个 CString 与另一个 CString 进行比较,就像 MySQL 在使用 ORDER BY field 时比较字符串一样?

编辑: 莫非 MySQLORDER BY BINARY field 使用了和CString::operator< 完全相同的比较函数?我当前的方法使用SORT BY fieldCString::CompareNoCase,如上所述,它们背后有不同的比较运算符。

【问题讨论】:

  • 您需要根据您的平台和配置使用什么算法来分析 MySQL,然后从那里获取。 CString 中可能没有预先实现的解决方案,您可能需要为您的应用程序提供自定义排序谓词。有关内置比较功能,请参阅 Comparing CString Objects
  • 编写自定义比较函数很可能太慢了。我可以保证ORDER BY BINARY 使用某些特定的运算符吗?我怎么知道?
  • 我看过文章,没有说明使用的是哪个比较运算符

标签: c++ mysql mfc compare c-strings


【解决方案1】:

CString::CompareNoCase() 使用比较。 MySQL 使用排序规则。

比较是严格的数值比较。语言规则仅用于进行大小写转换。 (在某些语言中进行大小写转换会导致问题。这不是一个好的选择。)排序规则使用语言规则,例如忽略破折号。

似乎 MySQL 有自己的内置排序规则表,所以只有两种方法可以完全完成 MySQL 的工作:

  • 从 MySQL 中提取代码并在您的代码中使用它(非常困难,并且可能存在许可问题。)
  • 将字符串发送到 MySQL 服务器,让服务器为您订购。

另一种方法是使用 Windows 中内置的排序功能更接近 MySQL 的行为。使用CString::Collate() 而不是CString::CompareNoCase()

如果 Windows 排序函数不能满足您的需求,您也可以使用内置于开源 ICU 库中的排序函数。

【讨论】:

  • 它必须非常高效,因此向 MySQL 服务器发送任何内容都不起作用。你觉得ORDER BY BINARY怎么样?
  • 二进制什么的? utf8?它适用于英语。对于所有适用的表,您需要在 MySQL 服务器上将排序顺序更改为 utf8_bin。您将失去不区分大小写的功能。您需要将所有本地 Unicode 字符串重新编码为 utf8 以便进行比较。不幸的是,这不适用于大多数语言,其中 Unicode 解决方案(如组合字符)可能导致不同的字节序列表示完全相同的东西。
  • 好的,但我有英语,还有一些额外的标记,如破折号、点、下划线等,但没有其他语言字母。我需要区分大小写
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
相关资源
最近更新 更多