【问题标题】:SQL tables using VARCHAR with UTF8 (with respect to multi byte character length)使用带有 UTF8 的 VARCHAR 的 SQL 表(关于多字节字符长度)
【发布时间】:2011-02-14 03:55:33
【问题描述】:

就像在 Oracle VARCHAR( 60 CHAR ) 中一样,我想指定一个可变长度的 varchar 字段,具体取决于插入的字符。

例如:

create table X (text varchar(3))
insert into X (text) VALUES ('äöü')

应该可以(使用 UTF8 作为数据库的默认字符集)。

在 DB2 上出现此错误:DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001 (字符数据,发生右截断;例如,更新或插入值是对于列来说太长的字符串,或者日期时间值不能分配给宿主变量,因为它太小了。)

我正在寻找 DB2、MsSql、MySql、Hypersonic 的解决方案。

【问题讨论】:

    标签: mysql sql-server utf-8 db2 hsqldb


    【解决方案1】:

    对于 HSQLDB (Hypersonic) VARCHAR(3) 的默认编码是 UTF16。

    【讨论】:

      【解决方案2】:

      DB2

      DB2 documentation 说:

      在多字节 UTF-8 编码中,每个 ASCII 字符占一个字节,但非 ASCII 字符每个占 2 到 4 个字节。定义 CHAR 字段时应考虑到这一点。根据 ASCII 与非 ASCII 字符的比例,大小为 n 字节的 CHAR 字段可以包含 n/4 到 n 个字符。

      这意味着对于 DB2 数据库,您无法完成您所要求的工作。


      MySql

      MySql documentation 说:

      UTF-8(具有 8 位单元的 Unicode 转换格式)是存储 Unicode 数据的另一种方法。它是根据 RFC 3629 实现的,它描述了占用一到四个字节的编码序列。目前,MySQL 对 UTF-8 的支持不包括四字节序列。 (UTF-8 编码的旧标准 RFC 2279 描述了占用 1 到 6 个字节的 UTF-8 序列。RFC 3629 使 RFC 2279 过时;因此,不再使用 5 和 6 个字节的序列。) /p>

      这意味着对于 MySql 数据库,您可以使用 VARCHAR(3) CHARACTER SET utf8 作为列定义来获取您所要求的内容。

      【讨论】:

        【解决方案3】:

        对于 SQL Server,您需要使用 NVARCHAR (unicode)。希望有人可以与其他人一起参与!

        【讨论】:

        • 不过,它没有指定编码 - 它不编码(它基本上使用 UTF16)。不过,这只是明智的做法。
        猜你喜欢
        • 1970-01-01
        • 2018-05-28
        • 2015-03-27
        • 2014-11-17
        • 2014-06-27
        • 2018-08-21
        • 2019-05-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多