我尝试使用存储过程来创建索引,但出现以下错误:
ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and
(utf8_unicode_ci,IMPLICIT) for operation '='
Run Code Online (Sandbox Code Playgroud)
没有行号或任何其他调试提示。
我有一个包含以下内容的示例数据文件,并使用 UTF8 编码保存。
\noab~opqr\n\xc3\xb6ab~\xc3\xb6pqr\n\xc3\xb6ab~\xc3\xb6pqr\n
Run Code Online (Sandbox Code Playgroud)\n该文件的格式是固定宽度,第 1 至第 3 列各分配 1 个字符,第 4 列保留 5 个字符。
\n我创建了一个 XML 格式文件,如下所示
\n<?xml version = "1.0"?> \n<BCPFORMAT xmlns="http://schemas.microsoft.com/sqlserver/2004/bulkload/format" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> \n <RECORD> \n <FIELD xsi:type="CharFixed" ID="Col1" LENGTH="1"/> \n <FIELD xsi:type="CharFixed" ID="Col2" LENGTH="1"/> \n <FIELD xsi:type="CharFixed" ID="Col3" LENGTH="1"/> \n <FIELD xsi:type="CharFixed" ID="Col4" LENGTH="5"/> \n <FIELD xsi:type="CharTerm" ID="LINE_BREAK" TERMINATOR="\\n"/> \n </RECORD> \n <ROW> \n <COLUMN SOURCE="Col1" NAME="Col1" xsi:type="SQLNVARCHAR"/> \n <COLUMN SOURCE="Col2" NAME="Col2" xsi:type="SQLNVARCHAR"/> \n <COLUMN SOURCE="Col3" NAME="Col3" xsi:type="SQLNVARCHAR"/> \n <COLUMN SOURCE="Col4" NAME="Col4" xsi:type="SQLNVARCHAR"/> …
Run Code Online (Sandbox Code Playgroud) Unicode代码点9619是一个叫“深色”字符:?
(http://unicode-table.com/en/search/?q=9619)。
使用SQL_Latin1_General_CP1_CI_AS
排序规则和 1252 代码页,我希望将该 Unicode 字符转换/转换为非 Unicode 数据类型会导致问号 ( ?
),因为代码页 1252 似乎不包含此字符,这似乎是 SQL Server 的无法进行转换时的行为。
所以我的问题是:为什么 SQL Server 将此字符转换为 ASCII 代码 166,即“管道,垂直竖线”:¦
?
SELECT NCHAR(9619), CAST(NCHAR(9619) AS CHAR(1)), ASCII(CAST(NCHAR(9619) AS CHAR(1)))
Run Code Online (Sandbox Code Playgroud) 我正在使用 5.6.28 MySQL 社区服务器在 CentOS 6.7 Linux 服务器上以德语托管 WordPress + ProPhoto 博客:
mysql> show tables;
+-----------------------+
| Tables_in_blog |
+-----------------------+
| wp_commentmeta |
| wp_comments |
| wp_links |
| wp_options |
| wp_postmeta |
| wp_posts |
| wp_term_relationships |
| wp_term_taxonomy |
| wp_terms |
| wp_usermeta |
| wp_users |
+-----------------------+
11 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
然后最近我开始开发俄语应用程序,不得不在/etc/my.cnf中将MySQL 设置更改为utf8mb4编码:
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqld]
character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
Run Code Online (Sandbox Code Playgroud)
现在我的第一个数据库有一个小问题,它仍然显示为latin1:
mysql> show …
Run Code Online (Sandbox Code Playgroud) SELECT datname, pg_encoding_to_char(encoding)
FROM pg_database;
Run Code Online (Sandbox Code Playgroud)
...列出所有数据库,每个数据库都有其编码类型。
但是,我试图找出PostgreSQL 服务器中可用的所有编码类型。我可以查询所有可用的编码类型吗?
还是在第 23.3 章字符集支持中列出了唯一可用的编码类型?
在 PostgreSQL 中,排序规则C
和C.UTF-8
?
两者都显示在pg_collation
. 无论数据库的实际编码是什么,它是否可能与编码C.UTF-8
相同?C
UTF-8
我遇到了类似于这个问题的情况,即我正在使用一个旧数据库,该数据库在 latin1 表中包含 UTF8 内容(我知道非常难看)。
\n\n现在我正在从一个完全 utf8 的新应用程序获取新数据,并与其数据库一起使用。为了支持其他遗留系统,应用程序还在遗留表中写入其 utf8 数据的副本。据我所知,只要您读回并将这些数据显示为 UTF8,就应该可以在 latin1 表中写入 utf8 内容。有很多教程解释了如何长期解决这种情况,但我宁愿不应用它们,除非绝对必要(遗留系统将很快被解雇,我不希望有停机时间来解决这个问题,如果可能的)
\n\n这是一个最小的 SQL 脚本,它重现了我的问题:
\n\nCREATE TABLE `articles` (\n `content` mediumtext NOT NULL,\n FULLTEXT KEY `content` (`content`)\n) ENGINE=MyISAM DEFAULT CHARSET=latin1;\n\nSET NAMES utf8;\nSET CHARACTER SET utf8;\n-- Turkish word for Croatia, second char is \\xC4\\xB1\nINSERT INTO `articles` (`content`) VALUES (\'H\xc4\xb1rvatistan\');\n
Run Code Online (Sandbox Code Playgroud)\n\n在我的系统中,我没有从 MySQL 收到错误,但在INSERT
语句之后,该单词的第二个字符被默默删除并替换为文字?
(\'\\x3F\')。
mysql> SELECT content, HEX(content), HEX(\'H\xc4\xb1rvatistan\') FROM articles;\n+-------------+------------------------+--------------------------+\n| content | HEX(content) | HEX(\'H\xc4\xb1rvatistan\') |\n+-------------+------------------------+--------------------------+\n| …
Run Code Online (Sandbox Code Playgroud) 我使用服务器端散列来传输密码,然后在数据库中运行 PBKDF2 来存储散列密码 + 盐组合。
散列nvarchar(max)
和@variable
持有相同值的HASHBYTES()
函数会产生不同的结果。
DECLARE @hash NVARCHAR(MAX) = 'password5baa61e4c9b93f3f0682250b6'
SELECT HASHBYTES('SHA1', 'password5baa61e4c9b93f3f0682250b6') AS NVARCHAR_INPUT,
HASHBYTES('SHA1', @hash) AS VARIABLE_INPUT
Run Code Online (Sandbox Code Playgroud)
产生以下结果:
NVARCHAR_INPUT | VARIABLE_INPUT
0xA03BEF0E3EC96CC7C413C6646D3FEC6174DA530F | 0x74B55C42E1E0AB5C5CDF10B28567590B240355C3
Run Code Online (Sandbox Code Playgroud)
这是 SQL Server 2012。这个特定的数据库正在运行 SQL Server Express,所以我也很好奇这个问题是否与版本无关。
我正在使用另一个主题的一些脚本,但接受的答案不适用于我的所有数据场景。我会问我关于如何检查非 Ascii 字符的原始帖子的问题,但我还没有足够的声誉来评论或投票。
问题:
我的测试
我使用示例数据、其中一个答案中的存储过程以及用于演示该问题的查询创建了SQL Fiddle。
查询 1:sample_table
-- Note: The "bad dash" row has char(150)
SELECT * FROM sample_table;
+-------------------+
| DataColumn |
+-------------------+
| test - good dash |
| test – bad dash |
+-------------------+
Run Code Online (Sandbox Code Playgroud)
SELECT dbo.Find_Invalid_Chars(DataColumn) [Invalid Characters]
FROM sample_table
WHERE dbo.Find_Invalid_Chars(DataColumn) IS NOT NULL;
+----------------------+
| Invalid Characters |
+----------------------+
| test [150] bad dash |
+----------------------+
Run Code Online (Sandbox Code Playgroud)
查询3: …
select * from (select N'?? ' as t) as t2 where t= ''
Run Code Online (Sandbox Code Playgroud)
字符串 '?? ' 匹配上面的检查,这是为什么?
encoding ×10
collation ×5
sql-server ×5
mysql ×3
unicode ×3
utf-8 ×3
postgresql ×2
t-sql ×2
hashing ×1
locales ×1
mysql-5.6 ×1
openrowset ×1