news 2026/7/5 5:18:33

【数据库】记录一次sql server在windows和linux服务器下安装,对于数据类型varchar和nvarchar的明显区别,你是否也遇到过中文匹配无法查询到数的情况

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【数据库】记录一次sql server在windows和linux服务器下安装,对于数据类型varchar和nvarchar的明显区别,你是否也遇到过中文匹配无法查询到数的情况

🌹欢迎来到《小5讲堂》🌹
🌹这是《Sql Server》系列文章,每篇文章将以博主理解的角度展开讲解。🌹
🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!🌹
👨💻 作者简介

🏆 荣誉头衔:2024博客之星Top14 | CSDN博客专家 | 阿里云专家博主

🎤 经历:曾多次进行线下演讲,亦是CSDN内容合伙人以及新星优秀导师

💡 信念“帮助别人,成长自己!”

🚀 技术领域:深耕全栈,精通 .NET Core (C#)、Python、Java,熟悉主流数据库

🤝 欢迎交流:无论是基础概念还是进阶实战,都欢迎与我探讨!

目录

  • 前言
  • 问题现象
  • 排查思路
    • 第一步:检查数据类型
    • 第二步:全匹配测试
    • 第三步:排除隐藏字符
  • 根本原因:排序规则差异
    • Windows vs Linux Docker 默认排序规则
    • 为什么会匹配失败?
  • 解决方案
    • 方案一:查询加 N 前缀(推荐)
    • 方案二:修改数据库排序规则(治本)
  • 经验总结
  • 参考
  • 文章推荐

前言

经常使用linux服务器的朋友可能会知道nvarchar和varchar的本质区别,对于博主最近才接触linux服务器来说,还是会才一点坑。
原来nvarchar匹配查询中文数据时,需要加一个N在前面,否则无法查询到数据,真是这十年开发经验白学了,现在才知道,必须给自己两巴掌反省反省。
SQL Server迁移Linux Docker:NVARCHAR查询为何失灵?
注意,如果是@title参数化就无需加N
还有个情况,就是varchar保存了中文,但是在导入linux系统的mssql后,出现了??问号

问题现象

SQL Server从Windows迁移到Linux Docker后,一条简单的查询语句返回了异常结果:

SELECTe_status_text,LEN(e_status_text),user_guidFROMmini_es_energyWHEREuser_guid='36f48dfd-a0c3-4277-8f38-eeb163953858'ANDe_status_textLIKE'%已到账%'

明明表中有e_status_text = '已到账'的记录,但LIKE '%已到账%'就是匹配不到,而'待到账''已退款'等值却能正常显示。

更诡异的是,用LEN()DATALENGTH()检查,长度和字节数都正常(3和6),没有任何隐藏字符。

排查思路

第一步:检查数据类型

SELECTDATA_TYPE,CHARACTER_MAXIMUM_LENGTHFROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_NAME='mini_es_energy'ANDCOLUMN_NAME='e_status_text';

结果:e_status_textnvarchar(50)

第二步:全匹配测试

改用=精确匹配依然查不到:

ANDe_status_text='已到账'-- 仍返回空

第三步:排除隐藏字符

查看实际存储值及其长度:

SELECTe_status_text,LEN(e_status_text)AS长度,DATALENGTH(e_status_text)AS字节数FROMmini_es_energyWHEREuser_guid='36f48dfd-a0c3-4277-8f38-eeb163953858';

结果完全正常:

e_status_text长度字节数
已到账36

数据本身没问题,问题出在比较规则上。

根本原因:排序规则差异

Windows vs Linux Docker 默认排序规则

环境默认排序规则中文支持
Windows ServerChinese_PRC_CI_AS✅ 原生支持
Linux DockerSQL_Latin1_General_CP1_CI_AS❌ 不支持中文代码页

为什么会匹配失败?

  • 字段e_status_textnvarchar(Unicode)
  • 查询字符串'已到账'被当作varchar(非Unicode)处理
  • 在 Linux Docker 的Latin1排序规则下,varchar无法正确转换为nvarchar进行中文比较
  • 导致字符匹配失败,查询返回空

简单说nvarchar字段 +varchar条件 + Latin1 排序规则 = 中文匹配失效。

解决方案

方案一:查询加 N 前缀(推荐)

所有涉及中文/Unicode字符串的条件,统一加N前缀,显式声明为 Unicode:

SELECTe_status_text,LEN(e_status_text),user_guidFROMmini_es_energyWHEREuser_guid='36f48dfd-a0c3-4277-8f38-eeb163953858'ANDe_status_text=N'已到账';-- = 匹配-- 或ANDe_status_textLIKEN'%已到账%';-- 模糊匹配

优点:立即生效,无需停机,符合SQL Server最佳实践,跨环境兼容。

方案二:修改数据库排序规则(治本)

将数据库排序规则改为中文支持的规则(需停机维护):

-- 查看当前排序规则SELECTname,collation_nameFROMsys.databasesWHEREname='你的数据库名';-- 修改为中文排序规则(需单用户模式)ALTERDATABASE你的数据库名COLLATEChinese_PRC_CI_AS;

⚠️注意:此操作会影响所有字符串比较,需重建部分索引,生产环境请谨慎操作。

经验总结

  1. nvarchar字段配N前缀是最佳实践,无论在Windows还是Linux都应如此。
  2. 跨平台迁移时,排序规则差异是常见陷阱,Windows上的“侥幸成功”不代表Linux上也能跑。
  3. 迁移前检查排序规则
    SELECTSERVERPROPERTY('Collation')ASServerCollation;
  4. 如果无法修改代码,可在迁移时指定与Windows一致的排序规则来避免此问题。

参考

  • SQL Server Collation 官方文档
  • Linux 上 SQL Server 的排序规则设置

文章推荐

【数据库】记录一次sql server在windows和linux服务器下安装,对于数据类型varchar和nvarchar的明显区别,你是否也遇到过中文匹配无法查询到数的情况

【数据库】Sql Server,A表的a字段更新到B表的a字段,基础知识点,一分钟拿下

【数据库】Sql Server数据库中isnull、iif、case when三种方式的使用和空值判断

【数据库】如何使用一款轻量级数据库SqlSugar进行批量更新,以及查看最终的Sql操作语句

【数据库】使用Sql Server将分组后指定字段的行数据转为一个字段显示,并且以逗号隔开每个值,收藏不迷路

【数据库】SQL Server 查询条件小技巧:ISNULL 函数的使用,有请DeepSeek来辅助讲解下

【Sql Server】在SQL Server中生成雪花ID(Snowflake ID)

【Sql Server】使用row_number over方式进行表分页,数据量达到五千多条记录后,查询变慢需要20多秒的解决方案

【Sql Server】随机查询一条表记录,并重重温回顾下自定义函数的封装和使用

【Sql Server】锁表如何解锁,模拟会话事务方式锁定一个表然后进行解锁

【Sql Server】通过Sql语句批量处理数据,使用变量且遍历数据进行逻辑处理

【新星计划回顾】第六篇学习计划-通过自定义函数和存储过程模拟MD5数据

【新星计划回顾】第四篇学习计划-自定义函数、存储过程、随机值知识点

【Sql Server】Update中的From语句,以及常见更新操作方式

总结:温故而知新,不同阶段重温知识点,会有不一样的认识和理解,博主将巩固一遍知识点,并以实践方式和大家分享,若能有所帮助和收获,这将是博主最大的创作动力和荣幸。也期待认识更多优秀新老博主。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/5 5:16:02

STM32F030RC驱动WS2812 LED灯条的实现与优化

1. 项目概述与硬件选型WS2812智能LED灯条与STM32F030RC微控制器的组合,为创客和嵌入式开发者提供了一个极具性价比的灯光控制解决方案。WS2812作为一款集成了控制电路的RGB LED,每个灯珠都能独立编程控制,仅需单线通信即可实现复杂的灯光效果…

作者头像 李华
网站建设 2026/7/5 5:15:41

League Akari:英雄联盟智能辅助工具终极指南与快速上手教程

League Akari:英雄联盟智能辅助工具终极指南与快速上手教程 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款基于…

作者头像 李华
网站建设 2026/7/5 5:15:08

Reactive Resume:免费开源的简历生成器

文章目录Reactive Resume:免费开源的简历生成器用起来有多简单隐私这块做得干净能力边界技术栈自己部署适合谁用Reactive Resume:免费开源的简历生成器 找工作的时候,简历是绕不开的。Word 排版麻烦,LaTeX 门槛高,市面…

作者头像 李华
网站建设 2026/7/5 5:13:28

Voron 2.4终极构建指南:从开源设计到工业级打印体验的完整蜕变

Voron 2.4终极构建指南:从开源设计到工业级打印体验的完整蜕变 【免费下载链接】Voron-2 Voron 2 CoreXY 3D Printer design 项目地址: https://gitcode.com/gh_mirrors/vo/Voron-2 你是否曾梦想拥有一台能够完美平衡速度、精度和可靠性的3D打印机&#xff1…

作者头像 李华
网站建设 2026/7/5 5:11:34

STL到STEP格式转换深度解析:stltostp完全攻略

STL到STEP格式转换深度解析:stltostp完全攻略 【免费下载链接】stltostp Convert stl files to STEP brep files 项目地址: https://gitcode.com/gh_mirrors/st/stltostp 在数字化设计和制造领域,STL到STEP格式转换是连接快速原型与精密工程的关键…

作者头像 李华
网站建设 2026/7/5 5:09:32

基于LLM与RAG的金融智能体实战:从架构设计到工程实现

1. 项目概述:从“满屏的智能体”到实战落地 最近和不少同行交流,大家聊起AI大模型,话题总绕不开“智能体”。无论是技术社区、行业峰会还是投资人的PPT里,“智能体”这个词出现的频率高得惊人,几乎到了“满屏皆是”的程…

作者头像 李华