【问题标题】:Mssql encoding problem with special characters带有特殊字符的 mssql 编码问题
【发布时间】:2021-02-04 11:54:56
【问题描述】:

我们正在使用 node-mssql 包插入和读取我们的 azure mssql 数据库。 数据库非常简单,因为它只是用作键/值缓存,其中值可以很长,并且还包含特殊字符。

数据库架构:

create table cache
(
    id       int identity
        constraint cache_pk
            primary key nonclustered,
    cacheKey varchar(500),
    ttl      bigint,
    value    varchar(max)
)
go

create index cache_cacheKey_index
    on cache (cacheKey desc)
go

create index cache_ttl_index
    on cache (ttl)
go

由于某种原因,当我在“值”中插入值时,一些特殊字符没有得到很好的处理。

Dash – example

变成:

Dash  example

我看到法国撇号也发生了同样的事情。 我也尝试过更改排序规则,但这并没有帮助。 还尝试使用nvarchar(max) 作为列类型。

这是插入代码(包括sql):

  const result = await conn.request()
                      .input('key', mssql.VarChar, key)
                      .input('value', mssql.Text, value)
                      .input('ttl', mssql.BigInt, cacheEndTime)
                      .query`INSERT INTO cache (cacheKey, value, ttl) VALUES (@key, @value, @ttl)`;

能否请您提供正确的表结构或 sql 语句来完成这项工作?

【问题讨论】:

  • 该值没有问题,因此这表明您有一些东西在某处剥夺了该值。文字 INSERT 工作正常:db<>fiddle

标签: sql-server azure azure-sql-database node-mssql


【解决方案1】:

我不确定是否可以帮助您,但是您检查过表、数据库和服务器的排序规则吗?整理有不同的级别。

【讨论】:

  • 您能否提供一个示例,说明使用排序规则正确创建代码的样子?我不确定使用哪一个或如何设置它。我们正在使用 Azure。我想那里的排序规则应该是正确的。
  • 运行以下命令更改数据库的字符集和排序规则: ALTER DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;运行以下命令更改表的字符集和排序规则: ALTER TABLE tablename CHARACTER SET utf8 COLLATE utf8_general_ci;
  • 感谢@RealSeik。不幸的是,我收到以下错误: Invalid collat​​ion 'utf8_general_ci'
【解决方案2】:

您的问题的答案在以下一项中:

  • 服务器排序规则
  • 表格排序规则
  • 字段排序规则
  • 投射插入文本

例如,如果您创建 nvarchar(如果您有国际场景,我建议您)字段,将文本插入转换为 N'text to insert'。

它会起作用的;)

【讨论】:

  • 如何使用这些动态@values 转换类型?
  • 如果字符在服务器排序规则的代码页之外,则 OP 不会得到它们的行为。 'Dash – example' 不会导致'Dash example',它会导致'Dash ? example'。这不是代码页问题,或者至少不是 SQL Server 的问题。
【解决方案3】:

我找到了答案。 就像@RealSeik 和@Larnu 已经说过的那样,这可能不是数据库或查询本身的问题,而是输入问题。

我意识到,node-sass 有一个 Unicode 文本类型,他们负责正确地转换它。 所以我把mssql.Text改成了mssql.NText

所以现在插入命令如下所示:

  const result = await conn.request()
                      .input('key', mssql.VarChar, key)
                      .input('value', mssql.NText, value)
                      .input('ttl', mssql.BigInt, cacheEndTime)
                      .query`INSERT INTO cache (cacheKey, value, ttl) VALUES (@key, @value, @ttl)`;

我还为我的其他脚本添加了排序规则,这也是很好的衡量标准。 (仅此一项并没有帮助,但可以很好地衡量)

    ALTER DATABASE MyDbName  
    COLLATE Latin1_General_100_CI_AI_SC_UTF8 ;  
    
    create table cache
    (
        id       int identity
            constraint cache_pk
                primary key nonclustered,
        cacheKey varchar(500) COLLATE Latin1_General_100_CI_AI_SC_UTF8,
        ttl      bigint,
        value    varchar(max) COLLATE Latin1_General_100_CI_AI_SC_UTF8
    )
    go
    
    create index cache_cacheKey_index
        on cache (cacheKey desc)
    go
    
    create index cache_ttl_index
        on cache (ttl)
    go

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多