土耳其语字符上的 Postgres upper 函数未返回预期结果

2023-12-20

看起来像 postgresupper/lower函数不处理土耳其语字符集中的选择字符。

select upper('Aaı'), lower('Aaİ') from mytable;

返回:

AAı, aaİ

代替 :

AAI, aai

请注意,正常的英语字符可以正确转换,但土耳其语 I(小写或大写)不能正确转换

Postgres 版本:9.2 32 bit

数据库编码(其中任何一个结果相同):UTF-8, WIN1254, C

客户端编码:

 UTF-8, WIN1254, C

OS: Windows 7 enterprise edition 64bit

SQL函数lower and upper在 UTF-8 编码数据库上为 ı 和 ï 返回以下相同字节

\xc4b1    
\xc4b0   

以及以下关于 WIN1254(土耳其语)编码数据库的内容

\xfd      
\xdd     

我希望我的调查是错误的,我错过了一些东西。


你的问题is100% 窗户。(或者更准确地说,是 Microsoft Visual Studio,PostgreSQL 是用它构建的。)

作为记录,SQLUPPER最终调用 Windows'LCMapStringW http://msdn.microsoft.com/en-us/library/windows/desktop/dd318700.aspx (via towupper http://msdn.microsoft.com/en-us/library/45119yx3.aspx via ) with almost所有正确的参数(区域设置 1055 土耳其语UTF-8-编码,Turkish_Turkey数据库),

but

Visual Studio 运行时(towupper)不设置LCMAP_LINGUISTIC_CASING http://www.siao2.com/2004/12/11/279942.aspx bit in LCMapStringW's dwMapFlags。 (我可以确认设置它确实有效。)Microsoft 不认为这是一个错误;这是设计使然,可能永远不会被“修复”(噢,遗产的乐趣。)

你有三种方法可以摆脱这种情况:

  • 实现 @Sorrow 的包装解决方案(或编写您自己的本机函数替换(DLL)。)
  • 在例如上运行您的 PostgreSQL 实例乌班图它表现出适合突厥语言环境的正确行为(@Sorrow 确认这对他有效);这可能是最简单、最干净的出路。
  • drop in 已修补的 32 位MSVCR100.DLL在你的 PostgreSQL 中bin目录(但是尽管UPPER and LOWER会起作用,但其他事情(例如排序规则)可能会继续失败——同样是在 Windows 级别。 YMMV。)

为了完整性(和怀旧的乐趣)ONLY,这里是修补 Windows 系统的过程(但请记住,除非您从头到尾管理这个 PostgreSQL 实例,否则您可能会给您的继任者带来很多痛苦;每当从如果您或您的继任者必须记住再次应用补丁——如果有一天您升级到 PostgreSQL 10,则表示使用MSVCR120.DLL代替MSVCR100.DLL,那么您也必须尝试修补新的 DLL。)在测试系统上

  • use HxD http://mh-nexus.de/en/hxd/打开C:\WINDOWS\SYSTEM32\MSVCR100.DLL
  • 立即以相同的名称将 DLL 保存在您的 PostgreSQL 下bin目录(不要尝试使用资源管理器或命令行复制文件,它们可能会复制 64 位版本)
  • with the file still open in HxD, go to Search > Replace, pick Datatype: Hexvalues, then
    • 搜索......4E 14 33 DB 3B CB 0F 84 41 12 00 00 B8 00 01 00 00
    • 用。。。来代替...4E 14 33 DB 3B CB 0F 84 41 12 00 00 B8 00 01 00 01
    • ……然后再一次……
    • 搜索......FC 51 6A 01 8D 4D 08 51 68 00 02 00 00 50 E8 E2
    • 用。。。来代替...FC 51 6A 01 8D 4D 08 51 68 00 02 00 01 50 E8 E2
  • ...and re-save under the PostgreSQL bin directory, then restart PostgreSQL and re-run your query.
    • 如果您的查询仍然不起作用(请确保您的数据库是 UTF-8 编码的Turkish_Turkey对彼此而言LC_CTYPE and LC_COLLATE) open postgres.exe in 32 位依赖项遍历器 http://www.dependencywalker.com并确保它指示已加载MSVCR100.DLL来自 PostgreSQLbin目录。
    • 如果所有函数都正常,则将修补的 DLL 复制到生产 PostgreSQLbin目录并重新启动。

但请记住,当您将数据从 Ubuntu 系统或已修补的 Windows 系统移至未修补的 Windows 系统时,您将再次遇到问题,并且如果 Windows 实例在Acitext场或在UPPER/LOWER基于函数的索引。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

土耳其语字符上的 Postgres upper 函数未返回预期结果 的相关文章

随机推荐

  • 调用方法后按钮变量变为 null

    在我的主要活动中 我有以下片段 MainActivity class private Button btnx10 Override protected void onCreate Bundle savedInstanceState supe
  • Font Awesome、Bootstrap 和屏幕阅读器辅助功能

    我想知道使用 Twitter Bootstrap 框架和 FontAwesome 图标字体的屏幕阅读器可访问性 我正在考虑两种不同的图标情况 1 该图标具有屏幕阅读器将拾取的帮助文本 a href class btn btn default
  • 为什么 Visual Studio 2008 在 Firefox 中运行缓慢?

    我正在使用 Microsoft Visual Web Developer 2008 Express 我创建了一个 ASP NET MVC 站点 其中 Site Master 文件的 HEAD 元素中有 6 个 CSS 文件和 6 个 Jav
  • 如何使用开始/停止谓词对列表的连续元素进行分组?

    假设我有一个类似的列表 def data a b c d e f g h b d x 和谓词如 defn start x x b defn stop x x d 标记子序列的第一个和最后一个元素 我想返回一个包含子组的列表 如下所示 par
  • 有什么方法可以控制 SqlEntityConnection 上的 AutoDetectChanges 吗?

    本文 http ilmatte wordpress com 2013 01 01 entity framework code first always disable autodetectchanges when importing dat
  • C# EF Linq 按位问题

    好的 例如 我按位使用如下 星期一 1 星期二 2 星期三 4 星期四 8 等 我正在使用业务实体框架类 我正在使用一个类并传递一个像 7 这样的值 星期一 星期二 星期三 我想返回与这些日子匹配的记录 public List
  • C# 回调接收UTF8字符串

    我有一个 C 函数 一个回调 从用 C 编写的 Win32 DLL 调用 调用者给了我一个UTF8字符串 但我无法正确接收它 所有匈牙利特殊字符都出错了 UnmanagedFunctionPointer CallingConvention
  • 如何在ionic 2/3中处理数据库异步操作

    我正在 ionic 中使用数据库 我调用一个 API 该 API 返回一些记录 我必须将这些记录插入数据库以及插入操作何时完成then我想从数据库中调用选择记录 问题是异步行为 在插入操作完成之前调用从数据库中选择记录 谁能帮我解决这个问题
  • 在 PHP 中验证电子邮件地址[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 PHP 中验证电子邮件地址 https stackoverflow com questions 12026842 how to validate an emailaddress in php
  • 如何按工作日顺序(如日历周)而不是按字母顺序(在 C# 中)排序?

    我无法弄清楚如何按日期对独立存储中的 XML 文件中的查询输出进行排序 该日期是 xml 文件中的值 我的意思是它将按当天的第一个字母排序 因此它将返回星期五作为第一个字母 因为其中有 F 但这不是我想要的 相反 它们应该按工作日的顺序排序
  • 从 File.OpenRead() 返回流

    我正在编写一个 WCF 服务 该服务将允许 ASP Net 网站检索文件 基于本文 http msdn microsoft com en us library ms789010 aspx Y912 我的问题是 当我返回流时 它是空白的 为简
  • WordPress wp_localize_script 是做什么的? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人可以解释一下吗wp localize script 做 即使我在 WP Codex 中读过它 我一开始也不明白它的作用 它允许您通过打
  • 如何在使用插件时将域添加到 next.config.js 的“next/image”

    这是我当前的设置 next config js const withImages require next images module exports withImages webpack config options return con
  • 使用 Promise 在 Node.js + Express 中进行错误处理

    使用 Node js Express 4 Mongoose 使用 Promise 而不是回调 我不知道如何整理我的错误处理 我得到的 相当简化的 是 app get xxx id function request response Xxx
  • 使用reduce在Javascript中构建过滤函数

    在一次采访中 有人向我提出了一个让我摸不着头脑的问题 我不想花周末担心结果 而是想尝试解决问题 但我无法弄清楚 使用下面的reduce函数 构建一个过滤函数 该函数将一个数组和一个测试函数作为参数 并返回一个新数组 该数组已根据测试函数过滤
  • SQL ORDER BY(序列)[重复]

    这个问题在这里已经有答案了 我有一个我想要的sql语句ORDER BY特定的顺序 SELECT FROM UserDB ORDER BY Role 我怎样才能将数据带到我的GridView表从顶部的 管理员 列出 然后是 用户 和 来宾 所
  • 如何在程序中获取 _GLOBAL_OFFSET_TABLE_ 地址?

    我想在我的程序中获取 GLOBAL OFFSET TABLE 的地址 一种方法是使用nm http linux about com library cmd blcmdl1 nm htmLinux 中的命令 可能会将输出重定向到文件并解析该文
  • 传递结构数组时遇到问题

    我一生都无法弄清楚如何在整个程序中传递这个结构数组 有人可以帮忙吗 现在我在 main 中收到一个错误 内容是 标记之前预期的主要表达式 Header ifndef HEADER H INCLUDED define HEADER H INC
  • 处理数据库中的层次结构数据

    我很想知道在数据库设计方面处理层次结构的最佳方法 最佳实践 是什么 这是我通常如何处理它们的一个小例子 节点表 NodeId int PRIMARY KEY NodeParentId int NULL DisplaySeq int NOT
  • 土耳其语字符上的 Postgres upper 函数未返回预期结果

    看起来像 postgresupper lower函数不处理土耳其语字符集中的选择字符 select upper Aa lower Aa from mytable 返回 AA aa 代替 AAI aai 请注意 正常的英语字符可以正确转换 但