【问题标题】:SQL: Storing Extended ASCII (128 to 255) in VARCHARSQL:在 VARCHAR 中存储扩展的 ASCII(128 到 255)
【发布时间】:2017-06-03 14:04:33
【问题描述】:

如何在 VARCHAR 中存储 128 到 255 个字符?

SQL 似乎将其中一些更改为 char(63) '?'。我不确定这是否与整理有关? UTF-8? N'..'?我试过 COLLATE Latin1_General_Bin,但不确定它是否支持扩展 ascii..

显然适用于 NVARCHAR,但理论上这也适用于 VARCHAR..?

【问题讨论】:

    标签: sql sql-server varchar extended-ascii


    【解决方案1】:

    存储在 varchar/char 列中超出 ASCII 0-127 字符范围的字符由与排序规则关联的代码页确定。代码页没有特别定义的字符被以太映射到类似的字符,或者,如果没有,'?'。

    您可以使用此查询列出排序规则以及关联的代码页:

    SELECT name, description, COLLATIONPROPERTY(name, 'CodePage') AS CodePage
    FROM fn_helpcollations();
    

    【讨论】:

    • 非常有帮助,找到了问题。它使用的代码页 1252 缺少一些扩展字符 129、141、143、144、157
    • @DaveSumter,您可以改用 nvarchar/nchar 来避免代码问题。
    • 感谢 Dan,我已经在使用 nvarchar。只是试图将其放入 varchar 以便将我的列大小减半。使用它来存储大量仅 ascii 数据..
    【解决方案2】:

    丹的回答让我进入了写作轨道。

    VARCHAR 确实存储了扩展 ASCII,但它取决于与排序规则关联的代码页。我正在使用 Latin1_General_100_BIN,它使用代码页 1252。

    https://en.wikipedia.org/wiki/Windows-1252

    根据此代码页,以下字符未定义:

    129、141、143、144、157

    实际上,SQL 似乎排除了从 128 到 159 的大多数字符。简单的解决方案就是删除这些字符。

    【讨论】:

    • 对,“扩展 ASCII”并不意味着足以使用该术语。字符在字符集中。一个字符集有一个名字。 “扩展 ASCII”不命名字符集。但是,您的问题是您似乎不知道源数据的字符集,并试图将其存储到并非旨在存储它的系统中。
    • 对不起,汤姆,不同意。扩展 ASCII 是大多数人都很好理解的术语:en.wikipedia.org/wiki/Extended_ASCII
    • “扩展 ASCII”很少传达足够的信息。这意味着:一个 129 到 256 个字符的 未指定 字符集,采用 1 字节编码,其中前 128 个字符匹配,并且编码与 ASCII 相同。在处理文本时,了解字符集和编码至关重要。没有文本,只有编码文本。如果你不知道字符集,那么知道它是几十个扩展的 ASCII 字符集之一几乎没有什么帮助——如果不知道具体的字符集,你怎么能知道呢?只有一种方法可以知道:作者以某种方式告诉你。
    • 在许多类型系统中,您不能以文本数据类型存储二进制数据(任意字节值和序列)。这包括 SQL 的 CHAR、VARCHAR、NCHAR、NVARCHAR、.NET 的 String 和 Char、Java 的 String、Character 和 char,......
    • 嗨,汤姆,我不存储文本。我正在存储 1 到 255 的字节值。为什么不能以文本数据类型存储字节值..?谢谢
    猜你喜欢
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 2014-02-23
    • 2011-02-11
    相关资源
    最近更新 更多