TSQL:识别Unicode列

时间:2017-01-10 09:56:08

标签: sql-server tsql unicode

前言我正在对“旧”PHP / SQL Server 2012系统进行维护,目标是提高整体性能

我立刻意识到数据库有很多“怪癖”,但我会遵循一个策略,我决定开始更正列的类型,特别是我注意到包含文本的列是ALL nvarchar(max),实际上作为一个应用程序Web,其中一些列是正确的,许多不是。 我正在尝试编写一个脚本,允许我将“varchar”设置为不包含unicode文本的列的数据类型。

我做了几个没有结果的研究,我找到的唯一解决方案就是将插入到varchar列的表中并验证不会出错..有一个更智能的解决方案吗?

1 个答案:

答案 0 :(得分:0)

来自我的评论:

  

NVARCHAR更改为VARCHAR会缩小尺寸,但不会   对性能有很大影响。你甚至可能陷入深深的麻烦   有特殊字符,突然返回???特别   处理Web应用程序时,您应该保持跨文化和   记住语言......

除此评论之外,这里还有一个查询,您可以使用它来获取大量元数据

SELECT c.DOMAIN_CATALOG
      ,c.TABLE_SCHEMA
      ,c.TABLE_NAME 
      ,c.COLUMN_NAME
      ,c.DATA_TYPE
      ,c.CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE c.DATA_TYPE IN ('varchar','nvarchar')
ORDER BY c.CHARACTER_MAXIMUM_LENGTH -- (-1 indicates "MAX")

一般情况下:检查您可以通过INFORMATION_SCHEMA检索的元数据

更新

您的评论

  

有些表有6000万行,我认为使用不必要的nvarchar而不是varchar可能会影响数据的权重

嗯,有了这么大的表,纯粹的大小(页面加载,disc-io)很重要。但其他尝试(指数,次优结构......)将产生更深层次的影响......

更新2

您可以查看以下内容:

DECLARE  @tbl TABLE(Some16Bit NVARCHAR(MAX),Some8Bit VARCHAR(MAX));
INSERT INTO @tbl(Some16Bit) VALUES(N'plain'),(N'Using russian: слов');

UPDATE @tbl SET Some8Bit=CAST(Some16Bit AS VARCHAR(MAX));

SELECT *
      ,CASE WHEN Some16Bit<>Some8Bit THEN 'Needs NVARCHAR' ELSE 'OK' END AS CheckNVARCHAR
FROM @tbl

结果

Some16Bit            Some8Bit           CheckNVARCHAR
-----------------------------------------------------
plain                plain              OK
Using russian: слов Using russian: ???? Needs NVARCHAR