如何为Azure SQL数据库设置UTF-8排序规则? UTF-8不在支持的排序规则列表中

时间:2018-10-28 13:11:10

标签: azure azure-sql-database

我目前将MySQL与<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> <div id="root"></div>一起使用,并且正在研究如何将数据导入Azure MSSQL数据库

根据本文档;

https://azure.microsoft.com/en-us/blog/working-with-collations-in-sql-azure/

它说我只能在服务器和数据库级别使用默认的utf8mb4_unicode_ci,但是可以在对象级别更改它;

  

SQL Azure数据库中字符数据的默认排序规则为SQL_Latin1_General_CP1_CI_AS。在SQL Azure基础结构中,也使用此排序规则来排序和比较定义数据库对象的元数据。服务器和数据库级别的排序规则不能在SQL Azure中配置。但是,您可以在列和表达式级别使用自己选择的排序规则。本文将向您展示方法。

但是,当我跑步时:

SQL_Latin1_General_CP1_CI_AS

在MSSQL Server Management Studio中,我获得了大量支持的排序规则;

enter image description here

但是此列表中甚至没有包含SELECT * FROM sys.fn_helpcollations();

我是MS SQL的新手,我缺少什么?我很难相信MS SQL无法处理UTF-8?

1 个答案:

答案 0 :(得分:0)

从历史上看,SQL Server使用一种单独的数据类型NVarchar来存储Unicode,该数据使用UTF-16编码。对于具有行和页压缩的表,SQL Server使用Unicode Compression,以便使用单个字节存储公共字符。因此,当前您会将列转换为Nvarchar,并可能在较大的表上启用行压缩。 Row Compression价格便宜,只需对所有数据类型使用可变宽度存储即可。

SQL Server 2019 is adding UTF-8编码,用于Varchar类型,主要是为了使此类转换更简单。尚未将其部署到Azure SQL数据库中,但是我希望这会在SQL Server 2019发布之前发生。

因此,您应该简单地选择一个兼容的数据库排序规则,以便类似于MySQL排序规则对字符串进行排序和比较。快速浏览一下文档表明SQL_Latin1_General_CP1_CI_AI可能是正确的排序规则,因为它不区分大小写和不区分重音。当然,您可能希望使用区分重音的排序规则,这是SQL Server中的默认设置。

EG

CREATE DATABASE MyDatabase  
COLLATE SQL_Latin1_General_CP1_CI_AI
(
  EDITION = 'Standard',   
  SERVICE_OBJECTIVE = 'S1'
);

然后对于任何将存储无法使用该排序规则存储在varchar列中的字符的列,将数据类型更改为NVarchar。

这是可以使用该排序规则存储在Varchar(N)中的可打印字符的列表。

!,",#,$,%,&;,',(,),*,+,,,-,.,/,0,1,2,3,4,5,6,7,8,9,:,;,<;,=,>;,?,@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,[,\,],^,_,`,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,{,|,},~,€,‚,ƒ,„,…,†,‡,ˆ,‰,Š,‹,Œ,Ž,,,‘,’,“,”,•,–,—,˜,™,š,›,œ,ž,Ÿ, ,¡,¢,£,¤,¥,¦,§,¨,©,ª,«,¬,­,®,¯,°,±,²,³,´,µ,¶,·,¸,¹,º,»,¼,½,¾,¿,À,Á,Â,Ã,Ä,Å,Æ,Ç,È,É,Ê,Ë,Ì,Í,Î,Ï,Ð,Ñ,Ò,Ó,Ô,Õ,Ö,×,Ø,Ù,Ú,Û,Ü,Ý,Þ,ß,à,á,â,ã,ä,å,æ,ç,è,é,ê,ë,ì,í,î,ï,ð,ñ,ò,ó,ô,õ,ö,÷,ø,ù,ú,û,ü,ý,þ,ÿ

如果您主要使用其他语言,则可以选择具有不同比较和排序规则的其他归类,并且可以在Varchar列中存储不同的Unicode字符子集。