sql-server - nvarchar 和 varchar 显示相同的数据

标签 sql-server sql-server-2012

IF OBJECT_ID('TEMPDB.DBO.#language_check', 'U') IS NOT NULL
    DROP TABLE #language_check;

CREATE TABLE #language_check (
    id INT identity(1, 1) NOT NULL,
    language_Used VARCHAR(50),
    uni_code NVARCHAR(2000)
    )

INSERT INTO #language_check (
    language_Used,
    uni_code
    )
VALUES (
    'English',
    N'Hello world! this is a text input for the table'
    ),
    (
    'German',
    N'Gemäß den geltenden Datenschutzgesetzen bitten wir Sie, sich kurz Zeit zu nehmen und die wichtigsten Punkte der Datenschutzerklärung von Google durchzulesen. Dabei geht es nicht um von uns vorgenommene Änderungen, sondern darum, dass Sie sich mit den wichtigsten Punkten vertraut machen sollten. Sie können Ihre Einwilligung jederzeit mit Wirkung für die Zukunft widerrufen.'
    ),
    (
    'Spanish',
    N'Bajo Rs 30.000, tanto los teléfonos tienen sus propios méritos y deméritos. El OnePlus 3 puntuaciones claramente muy por delante del Xiaomi MI 5 y también mucho más que muchos teléfonos inteligentes insignia en el mercado.'
    ),
    (
    'Czech',
    N'To je příklad.'
    ),
    (
    'Arabic',
    N'هذا مثال على ذلك.'
    )

SELECT *
FROM #language_check

结果如下。

enter image description here

然后在上表中添加一个varchar列,结果如下。

enter image description here

当我插入检查结果时,uni_code 和 nonunicode 列具有相同的值,但对于阿拉伯语非 unicode 列是“??????”。

  1. 谁能详细说明一下 uni_code 和 uni_code 具有相同值背后的原因吗? 非unicode 列。
  2. 为什么对于阿拉伯语,两列不相同。

提前致谢

最佳答案

Varchar 和 char 数据类型仅允许使用特定的字符集,包括德语、英语、西类牙语和捷克语等字符。在所有这些语言中,除了少数字符外,整个字符列表保持不变。要插入阿拉伯语等语言,请使用 Nvarchar 数据类型。您还可以强制表的列使用特定的排序规则来存储和检索阿拉伯语,但您可能会失去检索该特定排序规则不支持的字符的能力。创建表格时,使用排序规则,如下所示

CREATE TABLE #language_check 
    (
    id            INT identity(1, 1) NOT NULL,
    language_Used VARCHAR(50),
    uni_code      NVARCHAR(2000) ,
    nonuni_code   VARCHAR (2000) COLLATE Arabic_CI_AS
    )

这将允许阿拉伯字符串进入 nonuni_code varchar 列并检索确切的数据。但这不支持少数字符,例如 (ä Ëë Ḧḧ Ï ï N̈n̈ Öö T̈ẗ Üü Ẅẅ Ẍẍ ŸY)。当您查询#language_check时,您的结果将如图所示。

enter image description here

它不仅取决于数据类型,还取决于排序规则。在上面的提及表中,我们明确提及了阿拉伯语_CI_AS 的排序规则名称,因此阿拉伯语和英语将接受一些特殊字符,因此在结果中我们得到的 unicode 和非 unicode 列对于仅阿拉伯语和英语而言是相同的,其余的不相等

关于sql-server - nvarchar 和 varchar 显示相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38716816/

相关文章:

sql-server - 无法打开登录名请求的数据库 “dataname"。登录失败。用户登录失败

sql-server-2012 - 如何在 SQL Server 2012 中启用 -T1118 跟踪标志?

sql - 如何找到数据库中哪一行使用的空间最多?

sql - 如何使用 SQL Server 从当前日期减去 30 天

sql-server - SQL Server 使用标量值函数向我显示不同的行计数

sql - 如何在case语句中引用多列

sql-server - 将不同帐户类型(数据库类型)与付款和发票相关联的正确方法是什么?

mysql - 如何比较在数据库中存储为 String(varchar) 的日期?

c# - 从 SQL 加载时,SslStream.AuthenticateAsServer 证书失败,但从嵌入文件加载时有效

symfony - 如何在 DQL 查询中更改 LockMode,在 SQL Server 的 Doctrine 2 中