mysql - MySQL的ANSI和Unicode驱动的区别

标签 mysql database odbc driver difference

在 Windows 上选择 ODBC(64 位)下的数据源时,我得到 MySQL 数据库的两个可用选项:

  • MySQL ODBC 5.3 ANSI 驱动程序
  • MySQL ODBC 5.3 Unicode 驱动程序

这两者有什么区别?

最佳答案

首先我应该说我不使用 MySQL,但我知道 ODBC 驱动程序。在 ODBC 中,unicode 和 ansi 有不同的 API。 ansi API 以 A 结尾,unicode API 以 W 结尾(例如,SQLPrepareA 和 SQLPrepareW)。 ansi API 接受字符串的字节/八位字节,因此只能处理 chrs 0-255。 unicode API 接受 SQLWCHAR,它们是 2 字节 UCS-2 编码的 unicode 代码点(较新的 MS SQL Server 版本可以处理 UTF16 编码的字符串),因此可以处理大约 unicode 中的前 65000 个代码点。

因此,如果您需要存储 unicode 数据,则无法选择使用哪个驱动程序。

我不会让 Carnangel 对速度的评论让您无法使用 unicode 驱动程序,而且无论如何他的评论不包含任何事实。他可能指的是:

如果您将 unicode 数据存储在 MySQL 中,它将被 UTF-8 编码并作为 UTF-8 在您的网络上传输。在客户端,ODBC 驱动程序必须将 UTF-8 编码的数据转换为 UCS-2,因为这是 ODBC 需要的。显然相反。

如果您使用 unicode ODBC 驱动程序编写 ANSI ODBC 应用程序(即使用 ansi ODBC api 的应用程序),则 ODBC 驱动程序管理器必须将驱动程序返回的 UCS-2 转换为 8 位(有损)并转换您传递给 UCS-2 驱动程序的 8 位数据。所以不要那样做。

这些天来,如果有人仍在使用 ANSI ODBC 驱动程序,我会感到惊讶。

关于mysql - MySQL的ANSI和Unicode驱动的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25889046/

相关文章:

MySQL左连接自定义查询

mysql - 在 MYSQL 中使用 AUTO_INCRMENT

sql - 将列拆分为三列的新行

ios - 从 SQLite 数据库中删除行

sql - SSIS ODBC SQL 参数

javascript - JSTREE、dnd - 通过拖放更新 SQL 数据库

database - 使用索引在数据库中进行不区分大小写的搜索?

python - libmsodbcsql-13.0.so.0.0 的链接器错误阻止了 pyODBC 到 MS SQL 的连接。中央操作系统 7

sql-server - 无序读取列会返回不正确的值(SQL Server ODBC 驱动程序)

php - mysql表更新没有结果