我是 MySQL 的新手,我想知道:
如何utf-8像在 navicat 中那样创建带有字符集的数据库?
create mydatabase;
Run Code Online (Sandbox Code Playgroud)
...似乎正在使用某种默认字符集。
所以,我有几个带有 PostgreSQL 的 Debian 服务器。从历史上看,这些服务器和 PostgreSQL 使用拉丁文 9 字符集进行了本地化,当时还可以。现在我们必须处理波兰语、希腊语或中文等问题,因此改变它成为一个日益严重的问题。
当我尝试创建 UTF8 数据库时,收到消息:
错误:编码 UTF8 与语言环境 fr_FR 不匹配 详细信息:所选的 LC_CTYPE 设置需要编码 LATIN9。
有几次我和我的老朋友 Google 对这个主题进行了一些研究,我能找到的只是一些过于复杂的过程,比如更新 Debian LANG、使用正确的字符集重新编译 PostgreSQL、编辑所有LC_系统变量和其他晦涩的解决方案。所以暂时,我们把这个问题放在一边。
最近,它又回来了,希腊人想要这些东西,而拉丁语 9 不想。当我再次研究这个问题时,一位同事冲我说:“不,这很容易,你看。”
他什么也没编辑,也没有做魔术,他只是做这个 SQL 查询:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
Run Code Online (Sandbox Code Playgroud)
它工作得很好。
我实际上并不知道,LC_CTYPE='C'而且我很惊讶在 Google 甚至 Stack Overflow 上的第一个解决方案中都没有使用它。我环顾四周,只在 PostgreSQL 文档中找到了一个提及。
当 LC_CTYPE 为 C 或 POSIX 时,允许使用任何字符集,但对于 LC_CTYPE 的其他设置,只有一种字符集可以正常工作。由于 LC_CTYPE 设置被 initdb 冻结,因此在集群的不同数据库中使用不同编码的明显灵活性比实际更具理论性,除非您选择 C 或 POSIX 语言环境(从而禁用任何真正的语言环境感知)。
所以这让我想知道,这太容易了,太完美了,有什么缺点?而且我还很难找到答案。所以我来这里发帖:
tl; dr:使用 …
我在 Debian 上运行 Postgres 9.4.4,我得到以下ORDER BY行为:
veure_test=# show LC_COLLATE;
lc_collate
-------------
en_US.UTF-8
(1 row)
veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' ') ORDER BY 1;
regexp_split_to_table
-----------------------
a
A
b
c
Capacitor
CD
d
D
(8 rows)
Run Code Online (Sandbox Code Playgroud)
并且uname -a:
Linux ---- 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)
但是,在我的 iMac 上,使用 Postgres 9.3.4,我得到以下信息:
veure_test=# show LC_COLLATE;
lc_collate
-------------
en_US.UTF-8
(1 row)
veure_test=# SELECT regexp_split_to_table('D d a A c b CD Capacitor', ' …Run Code Online (Sandbox Code Playgroud) 我想根据其 Unicode 代码点将 Unicode 字符串变量设置为特定字符。
我想使用 65535 以外的代码点,但 SQL Server 2008 R2 数据库的排序规则为SQL_Latin1_General_CP1_CI_AS.
根据Microsoft 的 NCHAR 文档,该NCHAR函数采用如下整数:
整数表达式
当数据库的排序规则不包含补充字符 (SC) 标志时,这是一个从 0 到 65535(0 到 0xFFFF)的正整数。如果指定了超出此范围的值,则返回 NULL。有关补充字符的更多信息,请参阅排序规则和 Unicode 支持。
当数据库的排序规则支持补充字符 (SC) 标志时,这是一个从 0 到 1114111(0 到 0x10FFFF)的正整数。如果指定了超出此范围的值,则返回 NULL。
所以这段代码:
SELECT NCHAR(128512);
Run Code Online (Sandbox Code Playgroud)
NULL在此数据库中返回。
我希望它返回与此相同的:
SELECT N'';
Run Code Online (Sandbox Code Playgroud)
如何在排序规则“不包含补充字符 (SC) 标志”的数据库中使用代码(不使用实际表情符号字符)将 Unicode 字符串变量(例如 nvarchar)设置为表情符号?
(最终我希望任何角色都能工作。我只是为了便于参考而选择了表情符号。)
(虽然服务器是SQL Server 2008 R2,但我也很好奇以后版本有什么解决方案。)
假设没有办法,我可以在另一个具有适当排序规则的数据库中引用内联用户定义函数吗?
如何找到具有“补充字符”标志的归类?
这在我们的服务器上不返回任何记录:
SELECT * FROM sys.fn_helpcollations()
WHERE name LIKE 'SQL%[_]SC';
Run Code Online (Sandbox Code Playgroud)
似乎引入了 SQL Server …
如何更改整个服务器和特定数据库的 SQL Server 2008 R2 Express 默认排序规则?
有没有办法使用 SQL Server Management Studio 的可视化界面来做到这一点?在服务器属性窗口(以及相应的数据库属性窗口)中,此属性不可编辑。
排序规则对查询速度有任何影响吗?表的大小是否根据排序规则而变化?
如果我想构建一个必须支持所有可能语言的网站(例如 Google),推荐的排序规则是什么?
我将需要存储的字符,例如???,我的搜索过的网站将有返回something的sóméthíng输入,它必须是不区分大小写也是如此。
我怎么知道哪个是最好的选择?哪种排序规则更适合这种情况?
我想编写一个检查 PostgreSQL 表中使用的排序规则的脚本,但谷歌搜索Postgresql detect collation对我来说效果不佳,而且文档并没有让搜索变得容易。
谁能告诉我如何检查这个?
我正在设计一个以不同语言存储数据的数据库(使用 UTF-8),所以我认为显示查询结果的最佳方式是在查询期间根据用户的语言对其进行排序(因为有多个正确的方法来做到这一点),如下:
SELECT a < b COLLATE "de_DE" FROM test1;
Run Code Online (Sandbox Code Playgroud)
假设这是处理国际数据的正确方法,那么对于数据库本身来说,哪种整理是最好的呢?PostgreSQL 文档说:
C 和 POSIX 排序规则都指定了“传统的 C”行为,其中只有 ASCII 字母“A”到“Z”被视为字母,并且严格按照字符代码字节值进行排序。
我认为这是这种情况下的最佳选择,还是我错了?
(额外的问题:在查询本身中选择排序规则是否太慢?)。
今天七周内的七个数据库向我介绍了每个操作员的索引。
您可以通过创建
text_pattern_ops运算符类索引来为匹配先前查询的模式索引字符串,只要值以小写形式索引即可。
CREATE INDEX moves_title_pattern ON movies (
(lower(title) text_pattern_ops);
Run Code Online (Sandbox Code Playgroud)
我们使用 是
text_pattern_ops因为标题是文本类型。如果需要指数VARCHAR处理,字符,或名称,使用相关的OPS: ,varchar_pattern_ops,bpchar_pattern_ops和name_pattern_ops。
我觉得这个例子真的很混乱。为什么这样做有用?
如果该列是文本类型,那么在用作搜索值之前,其他类型(varchar、char、name)不会被强制转换为文本吗?
该索引的行为与使用默认运算符的索引有何不同?
CREATE INDEX moves_title_pattern ON movies (lower(title));
Run Code Online (Sandbox Code Playgroud) 我试图UNPIVOT在sys.databases2005 年到 2012 年的各种版本的 SQL Server 中包含的各种列上运行。
在UNPIVOT与以下错误消息失败:
Msg 8167, Level 16, State 1, Line 48
“CompatibilityLevel”列的类型与 UNPIVOT 列表中指定的其他列的类型冲突。
T-SQL:
DECLARE @dbname SYSNAME;
SET @dbname = DB_NAME();
SELECT [Database] = unpvt.DatabaseName
, [Configuration Item] = unpvt.OptionName
, [Configuration Value] = unpvt.OptionValue
FROM (
SELECT
DatabaseName = name
, RecoveryModel = CONVERT(VARCHAR(50), d.recovery_model_desc)
, CompatibilityLevel = CONVERT(VARCHAR(50), CASE d.[compatibility_level] WHEN 70 THEN 'SQL Server 7' WHEN 80 THEN 'SQL Server 2000' WHEN 90 THEN 'SQL …Run Code Online (Sandbox Code Playgroud) collation ×10
postgresql ×5
sql-server ×4
index ×2
ddl ×1
dml ×1
encoding ×1
metadata ×1
mysql ×1
performance ×1
t-sql ×1
unicode ×1
utf-8 ×1