none
char类型不能输入中文,查询显示是乱码,这是什么原因? RRS feed

  • 问题

  • 大家好,

    数据库版本是 MSSQL SERVER 2008R2 SP2,字符集为CP936,排序为Chinese_PRC_CI_AS.

    在数据类型为char的字段输入中文,显示为‘?’

    在另一个同样版本、排序规则、编码的mssql数据库上对char字段输入中文,可以正常显示,请问这是什么原因(异常的这台服务器还装了oracle)

    以上~

    2017年12月8日 7:46

答案

全部回复

  • 试试类型用 nchar

    在 sql 中写入的时候,字符串使用N前导

    N'中文'

    2017年12月8日 8:13
  • char属性是字符集CP936的GBK代码,两个字节的16进制;

    nchar属性是Unicode字符集,utf-8格式有一个字节、两个字节、三个字节和多个字节,

    GBK汉字按utf-8格式存储是三个字节;

    因此char属性存储的汉字和nchar属性存储的汉字是不能互换显示的,

    以nchar属性存储的汉字在char属性下显示为‘?’;

    必须将字段属性恢复成nchar,才能正常显示。

    2017年12月8日 8:34
  • char属性是字符集CP936的GBK代码,两个字节的16进制;

    nchar属性是Unicode字符集,utf-8格式有一个字节、两个字节、三个字节和多个字节,

    GBK汉字按utf-8格式存储是三个字节;

    因此char属性存储的汉字和nchar属性存储的汉字是不能互换显示的,

    以nchar属性存储的汉字在char属性下显示为‘?’;

    必须将字段属性恢复成nchar,才能正常显示。


    情况是,在另一个MSSQL SERVER上 建立char字段,可以输入中文,并在查询分析器中显示查询结果为中文

    这个显示正常的数据库的排序规则跟 异常的这个MSSQL server是一样的都是 Chinese_PRC_CI_AS

    这个怎么解释呢?

    2017年12月8日 9:03
  • 大致来说,char 是非 unicode,在服务端与客户端交互数据的时候,存在代码页转换的问题,服务端的字符在客户端需要转换为客户端的代码页,这个可能导致原码

    用 ncahr 不会产生这种问题,Unicode 是没有代码页转换的

    2017年12月8日 9:10
  • 此外,可以参阅一下Windows Collation设置资料:

    https://www.cnblogs.com/xwdreamer/archive/2012/07/11/2585993.html

    2017年12月11日 1:59
  • windows没有utf-8字符集的,只有Unix和Linux才有

    Love SQL

    2017年12月11日 2:43
  • 此外,可以参阅一下Windows Collation设置资料:

    https://www.cnblogs.com/xwdreamer/archive/2012/07/11/2585993.html

    在中文字符前加N,读取还是‘?’

    2017年12月11日 3:01
  • 如果要插入的数据中包含中文,建议使用nchar,带n的默认输入的数据不管是中文、英文或者数字都会占两个字节,不带n的默认中文占两个字节,英文占一个字节。为了避免产生乱码建议有中文时使用nchar或nvarchar
    2017年12月11日 3:10
  • 这个只能说有产生乱码的几率,不一定会百分百产生乱码,恰好那台机器就正常,而另一台机器就发生异常产生乱码。这个和写C#代码时有的代码会发生异常。需要try catch一样。  数据库表中带有中文数据使用nchar就是为了避免发生异常,产生乱码。
    2017年12月11日 3:15
  • 排序为Chinese_PRC_CI_AS是SQL Server 的Collation;

    Windows的Collation的设置值也很关键。

    2017年12月11日 4:53
  • windows没有utf-8字符集的,只有Unix和Linux才有

    Love SQL

    Windows SQL Server对中文的支持只能达到GBK二万个汉字,最多加上扩展A区四千个汉字,对扩展B区四万个方块字符(主要来自康熙字典等)无法予以支撑。

    2017年12月11日 5:13