zoukankan      html  css  js  c++  java
  • 使用 SQLServer On Linux 作为开发数据库遇到的编码问题

    在维护旧的项目的时候,遇到了使用 varchar 类型存储中文的情况,本地数据库是直接使用来自上古时期的 T-SQL 创建的。为了方便,我就没有安装 Windows 版的 SQLServer,直接用的 SQLServer On Linux On Docker。结果默认创建出来的数据库实例默认使用拉丁文编码,这导致了原有项目中 varchar 字段插入中文会乱码的问题。

    因为很容易就知道了是数据库 Collation 设置的问题,所以需要修改 DataBase、Table、Column 这几个层级的 Collation。不得不说,弄起来挺麻烦的,于是在爆栈网找到了一个非常厉害的脚本:

    DECLARE @collate SYSNAME
    SELECT @collate = 'Cyrillic_General_CS_AS'
    
    SELECT 
          '[' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + '] -> ' + c.name
        , 'ALTER TABLE [' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + ']
            ALTER COLUMN [' + c.name + '] ' +
            UPPER(t.name) + 
            CASE WHEN t.name NOT IN ('ntext', 'text') 
                THEN '(' + 
                    CASE 
                        WHEN t.name IN ('nchar', 'nvarchar') AND c.max_length != -1 
                            THEN CAST(c.max_length / 2 AS VARCHAR(10))
                        WHEN t.name IN ('char', 'varchar') AND c.max_length != -1 
                            THEN CAST(c.max_length AS VARCHAR(10))
                        WHEN t.name IN ('nchar', 'nvarchar', 'char', 'varchar') AND c.max_length = -1 
                            THEN 'MAX'
                        ELSE CAST(c.max_length AS VARCHAR(10)) 
                    END + ')' 
                ELSE '' 
            END + ' COLLATE ' + @collate + 
            CASE WHEN c.is_nullable = 1 
                THEN ' NULL'
                ELSE ' NOT NULL'
            END
    FROM sys.columns c
    JOIN sys.objects o ON c.[object_id] = o.[object_id]
    JOIN sys.types t ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id
    WHERE t.name IN ('char', 'varchar', 'text', 'nvarchar', 'ntext', 'nchar')
        AND c.collation_name != @collate
        AND o.[type] = 'U'
    

    可以一键生成修改 Column 的 SQL 脚本。

  • 相关阅读:
    CentOS安装使用.netcore极简教程(免费提供学习服务器)
    新生命团队netcore服务器免费开放计划
    线程池ThreadPool及Task调度死锁分析
    NetCore版RPC框架NewLife.ApiServer
    NewLife.Net——管道处理器解决粘包
    NewLife.Net——网络压测单机2266万tps
    NewLife.Net——构建可靠的网络服务
    NewLife.Net——开始网络编程
    搬家
    借助Redis做秒杀和限流的思考
  • 原文地址:https://www.cnblogs.com/JacZhu/p/8707047.html
Copyright © 2011-2022 走看看