【问题标题】:TSQL: Identify Unicode columnTSQL:识别 Unicode 列
【发布时间】:2017-01-10 09:56:07
【问题描述】:

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

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

我做了几项研究但没有结果,我发现的唯一解决方案是使用 varchar 列插入表并验证不会出错.. 有更聪明的解决方案吗?

【问题讨论】:

  • 在我看来,不要以数据类型开始你的目标,还有其他方法需要启动而不是更改数据类型,建议开始下一个链接:technet.microsoft.com/en-us/library/2008.08.database.aspx
  • NVARCHAR 更改为VARCHAR 会减小大小,但不会对性能产生太大影响。您甚至可能会因特殊字符而陷入困境,这些字符会突然返回为 ??? 尤其是处理 Web 应用程序,您应该牢记跨文化和语言...
  • 是的,你是对的,但是对机器进行分析我们注意到: 数据库变得庞大;查询真的很慢;一些查询可以冻结 sql server 机器;所有文本字段都是 nvarchar。我知道在很多情况下是可以纠正的,但我见过很多情况下不是绝对的。显然,我打算检查索引和查询,但我首先要确定列的数据类型的正确性。有些表有 6000 万行,我认为不必要地使用 nvarchar 而不是 varchar 可能会影响数据的权重。

标签: sql-server tsql unicode


【解决方案1】:

来自我的评论:

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可能会影响数据的权重

嗯,对于这么大的表,纯粹的大小(页面加载、磁盘 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

【讨论】:

  • 谢谢你,但我正在寻找一个脚本,它允许我识别包含 unicode 字符的字段,对于这些字段确实需要使用 nvarchar 列
  • 您是否真的要读取具有数百万行的表,取任何nvarchar,将此拆分为任何单个字符并检查需要unicode吗?即使您检测到可能8-bit 字符集的列,这也可能会在稍后中断...老实说:我会从其他地方开始...
  • @user1576228 查看我的更新 2
猜你喜欢
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多