• 使用 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 脚本。

  • 相关阅读:
    福尔摩斯的约会 (20)
    数素数 (20)
    STL源码分析-priority_queue
    STL源码分析-bitset
    STL源码分析-rbtree
    STM32自动生成精美图案
    STL源码分析-function
    STL源码分析-list
    STL源码分析-iterator
    STL源码分析-traits
  • 原文地址:https://www.cnblogs.com/JacZhu/p/8707047.html
Copyright © 2020-2023  润新知