Использование T-запятой (Ț) в предложении where - PullRequest
0 голосов
/ 09 октября 2019

В моей базе данных SQL Server есть запись пользователя с акцентированными символами в их фамилии. Имя ȚÎRA, то есть T-запятая (U + 021A), I-окружность (U + 00CE), R и A.

Независимо от того, что я пытаюсь, я не могу понять, какискать это имя и только это имя. Вот некоторые детали и то, что я пробовал:

Changed database context to 'mdb'.
1> SELECT name, collation_name FROM sys.databases WHERE name = 'mdb'
2> GO
name    collation_name
------- ----------------------------------------------------------------------------------------------------------------
mdb     Latin1_General_CI_AI

(1 rows affected)
1> SELECT last_name FROM ca_contact WHERE contact_uuid = 0x31BE7DEA327AF1439045420F87E036B2
2> GO
last_name
----------------------------------------------------------------------------------------------------
?IRA

(1 rows affected)
1> SELECT last_name FROM ca_contact WHERE last_name = 'ȚÎRA'
2> GO
last_name
----------------------------------------------------------------------------------------------------

(0 rows affected)
1> SELECT last_name FROM ca_contact WHERE last_name = 'TIRA'
2> GO
last_name
----------------------------------------------------------------------------------------------------

(0 rows affected)
1> SELECT last_name FROM ca_contact WHERE contact_uuid = 0x31BE7DEA327AF1439045420F87E036B2 AND last_name LIKE '%RA'
2> GO
last_name
----------------------------------------------------------------------------------------------------
?IRA

(1 rows affected)
1> SELECT last_name FROM ca_contact WHERE contact_uuid = 0x31BE7DEA327AF1439045420F87E036B2 AND last_name LIKE '__RA'
2> GO
last_name
----------------------------------------------------------------------------------------------------

(0 rows affected)
1> SELECT last_name FROM ca_contact WHERE contact_uuid = 0x31BE7DEA327AF1439045420F87E036B2 AND last_name LIKE '%IRA'
2> GO
last_name
----------------------------------------------------------------------------------------------------
?IRA

(1 rows affected)
1> SELECT last_name FROM ca_contact WHERE contact_uuid = 0x31BE7DEA327AF1439045420F87E036B2 AND last_name LIKE '_IRA'
2> GO
last_name
----------------------------------------------------------------------------------------------------

(0 rows affected)

The? в выводе sqlcmd - только моя консоль, студия управления SQL выводит символ очень хорошо, поэтому я не беспокоюсь об этом.

Я думаю, что я исключил проблему I-roundflex и, как вы можетевидите, я не могу сделать так, чтобы подстановочный знак одного символа попал в Т-запятую, и при этом я не могу искать его в буквальной форме или полагаясь на нечувствительность к акценту. Я не могу коснуться сортировки, поскольку приложение, которое использует эти данные, требует сортировки, показанной выше.

Я обнаружил, что T-запятая не работает, умлауты, ударения во французских именах и дажеC-cedillas работают просто отлично. Есть ли способ заставить поиски попасть в Т-запятую? Это вызывает проблемы у сотрудников службы поддержки, поскольку они не находят пользователя с обычным поиском, и мне интересно, нужно ли мне просто перебивать данные и заменять все не-ASCII-символы на ASCII, чтобы это работало. Было бы очень жаль, поскольку мы наконец начали использовать данные, которые не были тупыми, и были рады видеть, что «обычные» акценты, о которых я говорил, были обработаны без проблем.

1 Ответ

0 голосов
/ 09 октября 2019

Это просто из-за того, как вы обрабатываете строку, кодированную в Юникоде 'ȚÎRA'.

Рассмотрим следующий код:

CREATE TABLE #tmp (last_name NVARCHAR(20))
INSERT INTO #tmp VALUES (N'ȚÎRA')
SELECT * FROM #tmp WHERE last_name = 'ȚÎRA'
DROP TABLE #tmp

Это не приводит к результатам.

Однако, если вы будете искать N'ȚÎRA':

CREATE TABLE #tmp (last_name NVARCHAR(20))
INSERT INTO #tmp VALUES (N'ȚÎRA')
SELECT * FROM #tmp WHERE last_name = N'ȚÎRA'
DROP TABLE #tmp

Вы получите свой результат. N делает его строковым литералом Unicode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...