所有表格都在utf_unicode_ci
。
我这样做是为了检查
SELECT table_schema, table_name, column_name, character_set_name, collation_name
FROM information_schema.columns
WHERE collation_name <> 'utf8_unicode_ci' AND table_schema LIKE 'my_database'
ORDER BY table_schema, table_name, ordinal_position;
并转换每个表以防万一
ALTER TABLE `my_database`.`table_name` DEFAULT COLLATE utf8_unicode_ci;
ALTER TABLE `my_database`.`table_name` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;
我的数据库整理设置位于utf8_unicode_ci
。
charsets
mysql> show variables like 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.02 sec)
归类是
mysql> show variables like 'colla%'; +----------------------+-----------------+ | Variable_name | Value | +----------------------+-----------------+ | collation_connection | utf8_unicode_ci | | collation_database | utf8_unicode_ci | | collation_server | utf8_unicode_ci | +----------------------+-----------------+ 3 rows in set (0.00 sec)
无论是通过网络浏览器还是通过mysql bash客户端调用存储过程,都会触发错误。以防我的ubuntu / linux语言环境设置为:
$ locale LANG=es_ES.UTF-8 LANGUAGE=es_ES.UTF-8 LC_CTYPE=es_ES.UTF-8 LC_NUMERIC="es_ES.UTF-8" LC_TIME="es_ES.UTF-8" LC_COLLATE=es_ES.UTF-8 LC_MONETARY="es_ES.UTF-8" LC_MESSAGES=es_ES.UTF-8 LC_PAPER="es_ES.UTF-8" LC_NAME="es_ES.UTF-8" LC_ADDRESS="es_ES.UTF-8" LC_TELEPHONE="es_ES.UTF-8" LC_MEASUREMENT="es_ES.UTF-8" LC_IDENTIFICATION="es_ES.UTF-8" LC_ALL=
我能够解决此问题的唯一方法是在每个查询中使用convert
导致错误(或在查询中使用COLLATE
),但问题是存在很多非常复杂的存储过程因此很难识别“坏”查询并花费大量时间。
我想不知怎的,从我的系统(ubuntu:mysql客户端,浏览器)传递给存储过程的变量正在utf8_general_ci中发送,因此它与我的数据库中的ut8_unicode_ci冲突。
即使mysql连接设置为utf_unicode_ci,似乎os正在使用utf8_general_ci。
答案 0 :(得分:18)
我解决了我的问题,并且由于迁移过程中的错误转换,我转换为utf_general_ci而不是utf8_unicode_ci,所以尽管mysql数据库结构正确,但源数据编码错误(utf8_general_ci)并插入这样的mysql ddbb。
所以问题是你可以在mysql数据库中拥有正确的字符集和排序规则,并且仍然会出现“非法混合排序”错误,因为数据被另一个排序规则所包含。
希望将来对某人有所帮助。
答案 1 :(得分:2)
答案 2 :(得分:1)
如果您的编码和整理设置正确,则重新导入存储过程和存储的函数将解决问题。陷入同样的问题。用于故障排除的另一个有用的mysql本机函数:如果您怀疑表数据格式存在问题,请从some_table中选择collation(some_col)。
答案 3 :(得分:0)
我在参数列表中添加CHARSET utf8后解决了我的问题。可能这将有助于其他人,
PROCEDURE `USP_USR_AuthenticateUser`(
IN ip_username VARCHAR(50) CHARSET utf8**,
IN ip_pwd NVARCHAR(256)
)