2016-08-02 61 views
2
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 

这将导致如下结果。nvarchar和varchar显示相同的数据

enter image description here

然后加入varchar列于上述表和结果如下。

enter image description here

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

  1. 任何人都可以详细说明uni_code和nonunicode列的相同值背后的原因。
  2. 为什么阿拉伯语言这两列不一样。

在此先感谢

+0

更正确的问题是**为什么其他人都一样?** – FDavidov

+0

我认为当您检索数据时,这些值将采用正确的格式。试一试。 – Abhishek

+2

不确定*您要问的是 - 欧洲语言(德语,英语,西班牙语,捷克语)也会被'varchar'支持 - 在这种情况下,结果在两列中都是相同的(**如预期的**) - 但为了支持阿拉伯文,希伯来文,西里尔文,远东语等双字节语言,您必须**使用nvarchar来获得正确的结果。这是标准的,默认的,**有据可查的**行为 - 所以你在这里问我们什么**!?!?!?!?! –

回答

1

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列并获取确切的数据。但是这不会支持少数人物角色,例如(ËḦḧḦḧÏ̈̈̈̈ẗ̈ẗÜẄẅẄẅẌẍÿÿ)。当您查询#language_check时,您的结果将如图所示。

enter image description here

它不仅取决于数据类型也归类。在上面的表格中,我们明确提到了Arabic_CI_AS的排序规则名称,因此阿拉伯语言和英语语言将与一些特殊字符一起使用,因此在结果中我们得到的unicode列和nonunicode列对于阿拉伯语和英语都是相同的,并且休息是不相等的