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 脚本。

  • 相关阅读:
    Dockerfile深度剖析
    centos 7安装jdk8
    Centos 7 修改YUM镜像源地址为阿里云镜像地址
    Fabric智能合约(余额转移样本)
    Fabric智能合约(base)
    Fabric背书策略文件编写说明
    多catch块折叠
    Frp内网穿透服务部署
    Linux常用命令合集(初级)--Centos版
    English trip EM3-LP-5A Shopping Teacher: GABRIELE
  • 原文地址:https://www.cnblogs.com/JacZhu/p/8707047.html
Copyright © 2011-2022 走看看